Ускорьте работу генеративного искусственного интеллекта с Friendli
Клиент Friendli предлагает удобный интерфейс для взаимодействия с сервисами конечных точек, предоставляемыми Friendli Suite, идеальным решением для обслуживания генеративных моделей искусственного интеллекта. Разработанный для обеспечения гибкости и производительности, он поддерживает как синхронные, так и асинхронные операции, что позволяет легко интегрировать мощные возможности искусственного интеллекта в ваши приложения.
Чтобы начать работу с Friendli, установите клиентский пакет с помощью pip
:
pip install friendli-client
Важный
Вы должны установить переменную среды FRIENDLI_TOKEN
перед инициализацией экземпляра клиента с помощью client = Friendli()
. Альтернативно вы можете указать значение вашего личного токена доступа в качестве аргумента token
при создании клиента, например:
from friendli import Friendli
client = Friendli ( token = "YOUR PERSONAL ACCESS TOKEN" )
Бессерверные конечные точки Friendli предлагают простой интерфейс «нажми и играй» для доступа к популярным моделям с открытым исходным кодом, таким как Llama 3.1. Благодаря оплате за токен это идеально подходит для исследований и экспериментов.
Чтобы взаимодействовать с моделями, размещенными на бессерверных конечных точках, укажите код модели, который вы хотите использовать в аргументе model
. В таблице цен приведен список доступных кодов моделей и их цены.
from friendli import Friendli
client = Friendli ()
chat_completion = client . chat . completions . create (
model = "meta-llama-3.1-8b-instruct" ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
)
print ( chat_completion . choices [ 0 ]. message . content )
Выделенные конечные точки Friendli позволяют запускать собственные генеративные модели искусственного интеллекта на выделенных ресурсах графического процессора.
Для взаимодействия с выделенными конечными точками укажите идентификатор конечной точки в аргументе model
.
import os
from friendli import Friendli
client = Friendli (
team_id = os . environ [ "TEAM_ID" ], # If not provided, default team is used.
use_dedicated_endpoint = True ,
)
chat_completion = client . chat . completions . create (
model = os . environ [ "ENDPOINT_ID" ],
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
)
print ( chat_completion . choices [ 0 ]. message . content )
Friendli Container идеально подходит для пользователей, которые предпочитают обслуживать LLM в собственной инфраструктуре. Развернув Friendli Engine в контейнерах на своих локальных или облачных графических процессорах, вы сможете сохранять полный контроль над своими данными и операциями, обеспечивая безопасность и соответствие внутренним политикам.
from friendli import Friendli
client = Friendli ( base_url = "http://0.0.0.0:8000" )
chat_completion = client . chat . completions . create (
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
)
print ( chat_completion . choices [ 0 ]. message . content )
import asyncio
from friendli import AsyncFriendli
client = AsyncFriendli ()
async def main () -> None :
chat_completion = await client . chat . completions . create (
model = "meta-llama-3.1-8b-instruct" ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
)
print ( chat_completion . choices [ 0 ]. message . content )
asyncio . run ( main ())
from friendli import Friendli
client = Friendli ()
stream = client . chat . completions . create (
model = "meta-llama-3.1-8b-instruct" ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True ,
)
for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
Асинхронный клиент ( AsyncFriendli
) использует тот же интерфейс для потоковой передачи ответа.
import asyncio
from friendli import AsyncFriendli
client = AsyncFriendli ()
async def main () -> None :
stream = await client . chat . completions . create (
model = "meta-llama-3.1-8b-instruct" ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True ,
)
async for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
asyncio . run ( main ())
Если ваша конечная точка обслуживает модель Multi-LoRA, вы можете отправить запрос одному из адаптеров, указав маршрут адаптера в аргументе model
.
Для выделенных конечных точек Friendli укажите идентификатор конечной точки и маршрут адаптера, разделенные двоеточием ( :
).
import os
from friendli import Friendli
client = Friendli (
team_id = os . environ [ "TEAM_ID" ], # If not provided, default team is used.
use_dedicated_endpoint = True ,
)
chat_completion = client . lora . completions . create (
model = f" { os . environ [ 'ENDPOINT_ID' ] } : { os . environ [ 'ADAPTER_ROUTE' ] } " ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
)
Для контейнера Friendli просто укажите имя адаптера.
import os
from friendli import Friendli
client = Friendli ( base_url = "http://0.0.0.0:8000" )
chat_completion = client . lora . completions . create (
model = os . environ [ "ADAPTER_NAME" ],
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
)
Важный
gRPC поддерживается только контейнером Friendli, и доступен только API потоковой передачи v1/completions
.
Когда контейнер Frienldi работает в режиме gPRC, клиент может взаимодействовать с сервером gRPC, инициализируя его с аргументом use_grpc=True
.
from friendli import Friendli
client = Friendli ( base_url = "0.0.0.0:8000" , use_grpc = True )
stream = client . chat . completions . create (
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True , # Only streaming mode is available
)
for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
Клиент использует httpx
для отправки HTTP-запросов. Вы можете предоставить настроенный httpx.Client
при инициализации Friendli
.
import httpx
from friendli import Friendli
with httpx . Client () as client :
client = Friendli ( http_client = http_client )
Для асинхронного клиента вы можете предоставить httpx.AsyncClient
.
import httx
from friendli import AsyncFriendli
with httpx . AsyncClient () as client :
client = AsyncFriendli ( http_client = http_client )
import grpc
from friendli import Friendli
with grpc . insecure_channel ( "0.0.0.0:8000" ) as channel :
client = Friendli ( use_grpc = True , grpc_channel = channel )
Вы можете использовать тот же интерфейс для асинхронного клиента.
import grpc . aio
from friendli import AsyncFriendli
async with grpc . aio . insecure_channel ( "0.0.0.0:8000" ) as channel :
client = AsyncFriendli ( use_grpc = True , grpc_channel = channel )
Клиент Friendli предоставляет несколько методов управления ресурсами и их освобождения.
Клиенты Friendli
и AsyncFriendli
могут хранить сетевые подключения или другие ресурсы в течение своего существования. Чтобы обеспечить правильное освобождение этих ресурсов, вам следует либо вызвать метод close()
, либо использовать клиент в диспетчере контекста.
from friendli import Friendli
client = Friendli ()
# Use the client for various operations...
# When done, close the client to release resources
client . close ()
Для асинхронного клиента шаблон аналогичен:
import asyncio
from friendli import AsyncFriendli
client = AsyncFriendli ()
# Use the client for various async operations...
# When done, close the client to release resources
await client . close ()
Вы также можете использовать контекстный менеджер для автоматического закрытия клиента и освобождения ресурсов при выходе из блока, что делает его более безопасным и удобным способом управления ресурсами.
from friendli import Friendli
with Friendli () as client :
...
Для асинхронного использования:
import asyncio
from friendli import AsyncFriendli
async def main ():
async with AsyncFriendli () as client :
...
asyncio . run ( main ())
При использовании потоковых ответов крайне важно правильно закрыть HTTP-соединение после завершения взаимодействия. По умолчанию соединение автоматически закрывается, как только все данные из потока будут использованы (т. е. когда цикл for достигнет конца). Однако если потоковая передача прерывается из-за исключений или других проблем, соединение может оставаться открытым и не будет освобождено до тех пор, пока не будет произведена сборка мусора. Чтобы обеспечить правильное освобождение всех базовых соединений и ресурсов, важно явно закрыть соединение, особенно если потоковая передача преждевременно завершается.
from friendli import Friendli
client = Friendli ()
stream = client . chat . completions . create (
model = "meta-llama-3.1-8b-instruct" ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True ,
)
try :
for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
finally :
stream . close () # Ensure the stream is closed after use
Для асинхронной потоковой передачи:
import asyncio
from friendli import AsyncFriendli
client = AsyncFriendli ()
async def main ():
stream = await client . chat . completions . create (
model = "meta-llama-3.1-8b-instruct" ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True ,
)
try :
async for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
finally :
await stream . close () # Ensure the stream is closed after use
asyncio . run ( main ())
Вы также можете использовать контекстный менеджер для автоматического закрытия клиента и освобождения ресурсов при выходе из блока, что делает его более безопасным и удобным способом управления ресурсами.
from friendli import Friendli
client = Friendli ()
with client . chat . completions . create (
model = "meta-llama-3.1-8b-instruct" ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True ,
) as stream :
for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
Для асинхронной потоковой передачи:
import asyncio
from friendli import AsyncFriendli
client = AsyncFriendli ()
async def main ():
async with await client . chat . completions . create (
model = "meta-llama-3.1-8b-instruct" ,
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True ,
) as stream :
async for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
asyncio . run ( main ())
При использовании интерфейса gRPC с потоковой передачей вам может потребоваться отменить текущую операцию потока до ее завершения. Это особенно полезно, если вам нужно остановить поток из-за тайм-аута или по какой-либо другой причине.
Для синхронной потоковой передачи gRPC:
from friendli import Friendli
client = Friendli ( base_url = "0.0.0.0:8000" , use_grpc = True )
stream = client . chat . completions . create (
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True ,
)
try :
for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
except SomeException :
stream . cancel () # Cancel the stream in case of an error or interruption
Для асинхронной потоковой передачи gRPC:
import asyncio
from friendli import AsyncFriendli
client = AsyncFriendli ( base_url = "0.0.0.0:8000" , use_grpc = True )
async def main ():
stream = await client . chat . completions . create (
messages = [
{
"role" : "user" ,
"content" : "Tell me how to make a delicious pancake" ,
}
],
stream = True ,
)
try :
async for chunk in stream :
print ( chunk . choices [ 0 ]. delta . content or "" , end = "" , flush = True )
except SomeException :
stream . cancel () # Cancel the stream in case of an error or interruption
asyncio . run ( main ())
Вы также можете вызвать API-интерфейсы генерации напрямую с помощью CLI.
friendli api chat-completions create
-g " user Tell me how to make a delicious pancake "
-m meta-llama-3.1-8b-instruct
Для получения дополнительной информации о команде friendli
запустите friendli --help
в вашей терминальной оболочке. Это предоставит вам подробный список доступных опций и инструкции по использованию.
Кончик
Чтобы узнать больше, ознакомьтесь с нашей официальной документацией!