【AI提升】如何使用大模型:本機離線和FastAPI服務調用

大模型本身提供的功能,類似于windows中的一個exe小工具,我們可以本機離線調用然后完成具體的功能,但是別的機器需要訪問這個exe是不可行的。常見的做法就是用web容器封裝起來,提供一個http接口,然后接口在后端調用這個exe來實現需求。同理我們需要一個web容器把大模型封裝起來,然后通過API來提供AI服務

這里對比本機離線調用和API服務調用,并通過FastAPI來實現AI的API服務化(LangChain也是通過這些框架提供的API服務)。

一、本機離線調用

看代碼:

from transformers import AutoTokenizer, AutoModelMODEL_PATH = 'c:\\ai\\llms\\chatglm3-6b'
TOKENIZER_PATH = 'c:\\ai\\llms\\chatglm3-6b'# 第一步,獲取大模型
tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()
# add .quantize(bits=4, device="cuda").cuda() before .eval() to use int4 model
# must use cuda to load int4 model# 第二步,定義交互過程函數
def chat_handler(query: str):response = model.chat(tokenizer,query,history=None,top_p=1,max_new_tokens=1024,temperature=0.1)print(response, end="", flush=True)# 第三步,實際交互
chat_handler('who are you')

實際調用過程是比較簡單的,從大模型指定路徑加載大模型,然后就可以通過調用chat實現交互。

看結果:

二、通過FastAPI來封裝API服務

OpenAI提供了一個很好的接口規范,其余大模型以及大模型框架在提供接口時都做了類似的兼容處理,包括接口名、傳參方式、參數格式等都仿照OpenAI的接口方式,這樣可以大幅降低學習成本和模型切換的成本,當你想嘗試不同的大模型時不需要做大量的改動。

接下來主要是通過FastAPI來封裝我們的AI后臺服務器。

2.1 構建服務端

2.1.1 使用工具

這里使用三個工具:

  • FastAPI:FastAPI 是一個快速(高性能)的構建API的Web框架。
  • Uvicorn:Uvicorn 是一款高效的ASGI服務器,主要是為了服務端的高效異步處理。
  • Pydantic:Pydantic 是一款廣泛使用的數據校驗工具,主要是為了接口參數的規范和校驗。

通過使用三個工具,可以快速部署一個后端服務,并且這個服務可以對輸入參數進行方便的校驗,同時實現高效異步調控

在服務端安裝三個工具:

> pip install fastapi uvicorn pydantic

2.1.2 啟動服務端的代碼

from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
from transformers import AutoTokenizer, AutoModel, AutoModelForCausalLM# 第一步,加載大模型
model_dir = 'c:\\ai\\llms\\chatglm3-6b'
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModel.from_pretrained(model_dir, device_map="cuda", trust_remote_code=True).eval()# 第二步,創建FastAPI應用實例
app = FastAPI()# 第三步,定義請求類型,與OpenAI API兼容
class ChatCompletionRequest(BaseModel):model: strmessages: listmax_tokens: int = 1024temperature: float = 0.1# 第四步,定義交互函數
def chat_handle(messages: list, max_tokens: int, temperature: float):query = messages[0]["content"]response, history = model.chat(tokenizer,query=query,history=None,top_p=1,max_new_tokens=max_tokens,temperature=temperature)print(response)return response# 第五步,定義路由和處理函數,與OpenAI的API兼容
@app.post("/v1/chat/completions")
async def create_chat_completion(request: ChatCompletionRequest):# 調用自定義的文本生成函數response = chat_handle(request.messages, request.max_tokens, request.temperature)return {"choices": [{"message": {"content": response}}],"model": request.model}# 第六步,啟動FastAPI應用,默認端口為8000
if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=9999)

uvicorn.run(app, host="0.0.0.0", port=9999) 這里的host和port注意一下:

  • host="0.0.0.0",表示可以遠程訪問此服務,host="127.0.0.1",表示只能本地訪問。
  • port=9999,默認端口為8000,也可以自定義一個端口。

運行服務:

> python examples/dev_fastapi.py

服務啟動輸出:

表示服務已經啟動。

2.2 客戶端調用

2.2.1 通過命令和工具調用

當服務端啟動后,可以通過各種客戶端工具來調用,比如curl,這里使用postman。

可以看到服務端正確返回了。

查看服務端輸出:

2.2.2 通過代碼調用

import requests
import json# 定義請求的URL
url = "http://192.168.3.154:9999/v1/chat/completions"# 定義請求頭
headers = {'Content-Type': 'application/json'}# 定義請求體
data = {"model": "qwen2-7b","messages": [{"role": "user", "content": "who are you?"}],"max_tokens": 1024,"temperature": 0.5
}
# 將字典轉換為JSON格式
data_json = json.dumps(data)# 發送POST請求
response = requests.post(url, headers=headers, data=data_json)# 檢查響應狀態碼
if response.status_code == 200:# 如果響應成功,打印響應內容print(response.json())
else:# 如果響應失敗,打印錯誤信息print(f"Error: {response.status_code}, {response.text}")

運行命令:

> python examples/dev_fastapi_client.py

查看客戶端調用結果:

查看服務端輸出:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38783.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38783.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

KV260視覺AI套件--PYNQ-DPU-Resnet50

目錄 1. 簡介 2. 代碼解析 3. 全部代碼展示 4. 總結 1. 簡介 本文以 Resnet50 為例,展示使用 PYNQ 調用 DPU 運行 Resnet50 網絡的詳細過程,并對其中關鍵代碼做出解釋。 PYNQ是一個針對Xilinx Zynq平臺的Python開發框架,它允許開發者使…

KEYSIGHT是德科技 E5063A ENA 系列網絡分析儀

E5063A ENA 矢量網絡分析儀 18GHz 2端口 降低無源射頻元器件的測試成本 Keysight E5063A ENA 是一款經濟適用的臺式矢量網絡分析儀,可用于測試簡單的無源元器件,例如頻率最高達到 18 GHz 的天線、濾波器、電纜或連接器。 作為業界聞名的 ENA 系列…

深入解析 Laravel 事件系統:架構、實現與應用

Laravel 的事件系統是框架中一個強大且靈活的功能,它允許開發者在應用程序中定義和使用自定義事件和監聽器。這個系統基于觀察者模式,使得代碼解耦和可維護性大大提高。在本文中,我們將深入探討 Laravel 事件系統的工作原理、如何實現自定義事…

python @裝飾器的用法

裝飾器(decorators)是 Python 中的一種高級特性,它允許開發者修改函數或方法的行為,而不改變其定義。裝飾器通常用于日志記錄、權限檢查、性能測量等場景。裝飾器是通過在函數定義的前一行加上 decorator_name 來使用的。 基本用…

Qt簡單文本查找

Qt版本&#xff1a; Qt6 具體代碼&#xff1a; 1. 頭文件 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class QLineEdit; class QDialog; class QPushButton; class QVBoxLayout; class QTextEdit;QT_BEGIN_NAMESPACE namespace Ui…

為什么AI算法工程師要求C++?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「c&#xff0b;&#xff0b;的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;能跑出…

找到字符串中所有子串出現的位置python

直接find干就完了。 如果你希望找到字符串中所有子串出現的位置&#xff0c;而不僅僅是一個位置&#xff0c;你可以通過循環查找并收集所有起始位置。以下是修改后的代碼&#xff1a; def find_all_substring_positions(string, substring): positions [] # 用于存儲所有…

與枚舉結合的策略模式

枚舉類&#xff1a; package com.dtranx.tools.corpora.businessapi.enums;import com.dtranx.tools.commons.vo.EnumResponseVo; import com.google.common.collect.Lists;import java.util.List;/*** ClassName SimpleSearchMode* Description TODO* Date 2024/5/28 15:55* A…

VTK- 可視化過程 四種坐標系統

可視化工具包 VTK(Visualization Toolkit),是一種開源的可視化軟件系統,主要實現計算機圖形學、圖像分析、渲染、圖像處理等功能。VTK 包含一個 C類庫和多個不同語言調用接口層&#xff0c;主要針對2D、3D 圖像和可視化用圖設計。 VTK設計作為一個工具包&#xff0c;不依賴于特…

學校衛星電子怎么自動校準時間呢

在學校的教室里&#xff0c;衛星電子鐘精準地為師生們提供著時間服務&#xff0c;而其自動校準時間的功能令人稱奇。那么&#xff0c;學校衛星電子鐘是如何實現自動校準時間的呢&#xff1f; 學校衛星電子鐘自動校準時間的原理基于衛星導航系統。常見的如北斗衛星導航系統或 GP…

知迪科技驚艷亮相高工智能汽車開發者大會,精彩演講直擊行業痛點、探索未來趨勢

6月27-28日&#xff0c;高工智能汽車開發者大會在上海隆重舉行&#xff0c;知迪科技受邀攜產品與解決方案出席此次大會。 智能汽車已經進入跨域融合新時代。為了進一步降低成本和增強協同&#xff0c;汽車電子架構的設計開始向跨域融合方向演進&#xff0c;并且變革的速度在加快…

java 面試題 - 索引

上腦圖&#xff0c;大家要記住&#xff01;&#xff01; 看不清&#xff0c;上大圖&#xff01; 這幾總結就夠用&#xff01;&#xff01;

nginx優化和防盜鏈

1、隱藏版本號 [roottest1 conf]# vim nginx.conf ? server_tokens off; ? 2、防盜鏈 修改用戶和所在組 [roottest1 conf]# vim nginx.conf ? #user nginx nginx; #表示主進程master會有root創建&#xff0c;子進程會有nginx用戶來創建。 3、設置頁面的緩存時間 主要是…

ExoPlayer架構詳解與源碼分析(14)——ProgressiveMediaPeriod

系列文章目錄 ExoPlayer架構詳解與源碼分析&#xff08;1&#xff09;——前言 ExoPlayer架構詳解與源碼分析&#xff08;2&#xff09;——Player ExoPlayer架構詳解與源碼分析&#xff08;3&#xff09;——Timeline ExoPlayer架構詳解與源碼分析&#xff08;4&#xff09;—…

高考完的假期想學c語言 要注意那些問題?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「c語言的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;其實建議高考完之后好好玩一…

線上問題定位分析寶典——Linux中定位JVM問題常用命令

查詢Java進程ID #ps axu | grep java #ps elf | grep java查看機器負載及CPU信息 #top -p 1(進程ID) #top (查看所有進程)獲取CPU飆升線程堆棧 1. top -c 找到CPU飆升進程ID&#xff1b; 2. top -Hbp 9702(替換成進程ID) 找到CPU飆升線程ID&#xff1b; 3. $ printf &quo…

Java 7新特性深度解析:提升效率與功能

文章目錄 Java 7新特性深度解析&#xff1a;提升效率與功能一、Switch中添加對String類型的支持二、數字字面量的改進三、異常處理&#xff08;捕獲多個異常&#xff09;四、增強泛型推斷五、NIO2.0&#xff08;AIO&#xff09;新IO的支持六、SR292與InvokeDynamic七、Path接口…

64.ThreadLocal造成的內存泄漏

內存泄漏 程序中已動態分配的堆內存,由于某種原因程序為釋放和無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。內存泄漏的堆積終將導致內存溢出。 內存溢出 沒有足夠的內存提供申請者使用。 ThreadLocal出現內存泄漏的真實原因 內存泄漏的發…

Java中的多線程與并發編程詳解

Java中的多線程與并發編程詳解 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在當今軟件開發中&#xff0c;利用多核處理器的能力并行執行任務已成為提高應用…

Transformer拆積木

文章目錄 ConceptsEmbeddingEncoderDecoderSelf-Attention matric calculationFinal Linear and Softmax LayerLoss function 參考 學一下已經問鼎中原七年之久的Transformer Concepts 開始拆積木&#xff01; Embedding Encoder Decoder Self-Attention matric calculati…