Я настроил FastAPI с Llama.cpp и Langchain. Теперь я хочу включить потоковую передачу ответов FastAPI. Потоковая передача работает с Llama.cpp в моем терминале, но мне не удалось реализовать ее с помощью ответа FastAPI.
Большинство руководств посвящены включению потоковой передачи с помощью модели OpenAI, но я использую локальный LLM (квантованный Mistral) с llama.cpp. Я думаю, мне нужно изменить обработчик обратного вызова, но никакой учебник не помог. Вот мой код:
from fastapi import FastAPI, Request, Response
from langchain_community.llms import LlamaCpp
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
import copy
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
model_path = "../modelle/mixtral-8x7b-instruct-v0.1.Q5_K_M.gguf"
prompt= """
[INST] Im folgenden bekommst du eine Aufgabe. Erledige diese anhand des User Inputs.
### Hier die Aufgabe: ###
{typescript_string}
### Hier der User Input: ###
{input}
Antwort: [/INST]
"""
def model_response_prompt():
return PromptTemplate(template=prompt, input_variables=['input', 'typescript_string'])
def build_llm(model_path, callback=None):
callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])
#callback_manager = CallbackManager(callback)
n_gpu_layers = 1 # Metal set to 1 is enough. # ausprobiert mit mehreren
n_batch = 512#1024 # Should be between 1 and n_ctx, consider the amount of RAM of your Apple Silicon Chip.
llm = LlamaCpp(
max_tokens =1000,
n_threads = 6,
model_path=model_path,
temperature= 0.8,
f16_kv=True,
n_ctx=28000,
n_gpu_layers=n_gpu_layers,
n_batch=n_batch,
callback_manager=callback_manager,
verbose=True,
top_p=0.75,
top_k=40,
repeat_penalty = 1.1,
streaming=True,
model_kwargs={
'mirostat': 2,
},
)
return llm
# caching LLM
@lru_cache(maxsize=100)
def get_cached_llm():
chat = build_llm(model_path)
return chat
chat = get_cached_llm()
app = FastAPI(
title="Inference API for Mistral and Mixtral",
description="A simple API that use Mistral or Mixtral",
version="1.0",
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
def bullet_point_model():
llm = build_llm(model_path=model_path)
llm_chain = LLMChain(
llm=llm,
prompt=model_response_prompt(),
verbose=True,
)
return llm_chain
@app.get('/model_response')
async def model(question : str, prompt: str):
model = bullet_point_model()
res = model({"typescript_string": prompt, "input": question})
result = copy.deepcopy(res)
return result
В примере блокнота я вызываю FastAPI следующим образом:
Итак, с помощью этого кода можно получать ответы от API. Но я вижу только потоковую передачу в своем терминале (думаю, это из-за StreamingStdOutCallbackHandler). После завершения потоковой передачи в терминале я получаю ответ FastAPI.
Что Нужно ли мне что-то менять сейчас, чтобы я мог осуществлять потоковую передачу токен за токеном с помощью FastAPI и локальной модели llama.cpp?
Я настроил FastAPI с Llama.cpp и Langchain. Теперь я хочу включить потоковую передачу ответов FastAPI. Потоковая передача работает с Llama.cpp в моем терминале, но мне не удалось реализовать ее с помощью ответа FastAPI. Большинство руководств посвящены включению потоковой передачи с помощью модели OpenAI, но я использую локальный LLM (квантованный Mistral) с llama.cpp. Я думаю, мне нужно изменить обработчик обратного вызова, но никакой учебник не помог. Вот мой код: [code]from fastapi import FastAPI, Request, Response from langchain_community.llms import LlamaCpp from langchain.callbacks.manager import CallbackManager from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler import copy from langchain.chains import LLMChain from langchain.prompts import PromptTemplate
n_gpu_layers = 1 # Metal set to 1 is enough. # ausprobiert mit mehreren n_batch = 512#1024 # Should be between 1 and n_ctx, consider the amount of RAM of your Apple Silicon Chip.
@app.get('/model_response') async def model(question : str, prompt: str): model = bullet_point_model() res = model({"typescript_string": prompt, "input": question}) result = copy.deepcopy(res) return result [/code] В примере блокнота я вызываю FastAPI следующим образом: [code]import subprocess import urllib.parse import shlex query = input("Insert your bullet points here: ") task = input("Insert the task here: ") #Safe Encode url string encodedquery = urllib.parse.quote(query) encodedtask = urllib.parse.quote(task) #Join the curl command textx command = f"curl -X 'GET' 'http://127.0.0.1:8000/model_response?question={encodedquery}&prompt={encodedtask}' -H 'accept: application/json'" print(command) args = shlex.split(command) process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() print(stdout) [/code] Итак, с помощью этого кода можно получать ответы от API. Но я вижу только потоковую передачу в своем терминале (думаю, это из-за StreamingStdOutCallbackHandler). После завершения потоковой передачи в терминале я получаю ответ FastAPI. Что Нужно ли мне что-то менять сейчас, чтобы я мог осуществлять потоковую передачу токен за токеном с помощью FastAPI и локальной модели llama.cpp?
Я запускаю ehartford_dolphin-2.1-mistral-7b на машине RTX A6000 на RunPod с шаблоном TheBloke LLM Text Generation WebUI.
У меня есть 2 варианта: запуск webui на runpod или запуск шаблона вывода HuggingFace Text Generation на runpod
Вариант 1....
У меня проблемы с потоковой передачей от Flir Grasshopper3 до OpenCV. Есть ли способ транслировать непосредственно от камеры FLIR в мой код с помощью Python? Когда я использую приведенный ниже код, CV.VideoCapture не может распознать камеру FLIR в...
Я использую llama-cpp-python для запуска Mistral-7B-Instruct-v0.3-GGUF на виртуальной машине Azure.
Я протестировал модель Mistral-7B -Instruct-v0.3.Q4_K_M.gguf и Mistral-7B-Instruct-v0.3.fp16.gguf в виртуальной машине с 32 виртуальными ЦП. Все...
Я пытаюсь погрузиться в большой паркетный файл с полярными. Это должно быть легко достичь в (1) памяти:
import os ; os.environ = '4'
import polars as pl
import time, random
import numpy as np
random.seed(42)