來源:Deephub Imba
本文我們將總結(jié)5種搭建開源大語言模型服務(wù)的方法,每種都附帶詳細(xì)的操作步驟,以及各自的優(yōu)缺點(diǎn)。
在不斷發(fā)展的大型語言模型(LLMs)領(lǐng)域中,用于支持這些模型的工具和技術(shù)正以與模型本身一樣快的速度進(jìn)步。在這篇文章中,我們將總結(jié)5種搭建開源大語言模型服務(wù)的方法,每種都附帶詳細(xì)的操作步驟,以及各自的優(yōu)缺點(diǎn)。
1、Anaconda + CPU
我們首先介紹門檻最低的入門級(jí)方法,因?yàn)檫@個(gè)方法不需要GPU,基本上只要有一個(gè)還不錯(cuò)的CPU和足夠RAM就可以運(yùn)行。
這里我們使用llama.cpp及其python綁定llama-cpp-python
pip install llama-cpp-python[server] --extra-index-url https://abetlen.github.io/llama- cpp-python/whl/cpu
創(chuàng)建一個(gè)名為models/7B的目錄來存儲(chǔ)下載的模型。然后使用命令下載GGUF格式的量化模型:
mkdir -p models/7B wget -O models/7B/llama-2-7b-chat.Q5_K_M.gguf https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q5_K_M.gguf?download=true
然后就可以運(yùn)行以下命令啟動(dòng)服務(wù)器:
python3-mllama_cpp.server--modelmodels/7B/llama-2-7b-chat.Q5_K_M.gguf將環(huán)境變量MODEL設(shè)置為下載模型的路徑。然后運(yùn)行openai_client.py腳本就可以訪問我們的查詢服務(wù)器。openai_client.py使用OpenAI庫調(diào)用LLM服務(wù)器并打印響應(yīng)。
messages=[ {"role": "system", "content": "You are a helpful assistant."}, { "role": "user", "content": "What are the names of the four main characters of South Park?", }, ]
因?yàn)檫@個(gè)方法是門檻最低的,所以他的速度也是最慢的,基于IntelCorei9-10900F CPU @ 2.80GHz的系統(tǒng)的處理時(shí)間大概是13秒左右,所以這個(gè)方法一般用作我們的本地測試服務(wù)(如果你GPU不夠的話)。
2、Anaconda + GPU
前面的CPU方法是非常慢的,為了加快速度我們將使用vllm,這是一個(gè)專門為有效利用gpu而設(shè)計(jì)的工具。
pipinstallvllm
執(zhí)行以下命令來啟動(dòng)服務(wù)器:?
python-mvllm.entrypoints.openai.api_server--modelTheBloke/Llama-2-7B-Chat-AWQ--api-keyDEFAULT--quantizationawq--enforce-eager
這將下載AWK量化模型并啟動(dòng)一個(gè)OpenAI兼容服務(wù)器,我們可以像使用llama.cpp一樣進(jìn)行查詢。
“— enforce-eager”是費(fèi)差個(gè)重要的,因?yàn)樗试S模型在我的10G VRAM GPU中運(yùn)行,沒有內(nèi)存不足的錯(cuò)誤。
在Nvidia RTX 3080 GPU和IntelCorei9-10900F CPU的系統(tǒng)下處理時(shí)間只有0.79s。CPU快20倍左右,這就是為什么GPU現(xiàn)在都那么貴的一個(gè)原因。
這種方式可以用做我們測試服務(wù)器或者在線上的小規(guī)模部署,如果要求不高,也可以當(dāng)作生產(chǎn)環(huán)境來使用,當(dāng)然維護(hù)起來非常麻煩。
3、Docker + GPU
vllm有很多依賴,如果要批量的安裝是一件非常耗時(shí)的事情。好在vllm還提供了一個(gè)預(yù)構(gòu)建的docker映像,它已經(jīng)包含了所需的所有庫。
對(duì)于ubuntu,我們首先安裝Nvidia CUDA Toolkit,如果安裝了則跳過
sudoaptinstallnvidia-cuda-toolkit然后添加Nvidia Docker存儲(chǔ)庫并安裝Nvidia Container Toolkit:
distribution=$(./etc/os-release;echo$ID$VERSION_ID)curl-s-Lhttps://nvidia.github.io/nvidia-docker/gpgkey|sudoapt-keyadd-curl-s-Lhttps://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list|sudotee/etc/apt/sources.list.d/nvidia-docker.listsudoapt-getupdate&&sudoapt-getinstall-ynvidia-container-toolkitsudosystemctlrestartdocker
配置Docker使用Nvidia runtime:
sudotee/etc/docker/daemon.json< 然后就可以運(yùn)行我們的模型了:dockerrun--runtimenvidia--gpusall-v~/.cache/huggingface:/root/.cache/huggingface-p8000:8000--ipc=hostvllm/vllm-openai:latest--modelTheBloke/Llama-2-7B-Chat-AWQ--quantizationawq--enforce-eager
這里我們使用-v參數(shù)將本地的磁盤映射到容器中,這樣所有的容器都可以使用huggingface的模型緩存,避免了重復(fù)下載。
docker的部署方式處理一個(gè)查詢的時(shí)間在0.8s左右與使用相同硬件在Anaconda上運(yùn)行vllm相似。
使用docker可以大大簡化我們服務(wù)器的環(huán)境配置,配合集群管理腳本可以適用于大規(guī)模的服務(wù)部署。
上面的方式都適用于本地和有GPU主機(jī)/集群的方式,下面我們介紹2個(gè)比較簡單的云GPU的方案,這兩個(gè)方案都是按需付費(fèi)的。
4、modal
Modal可以簡化無服務(wù)器應(yīng)用程序的部署,特別是那些利用GPU資源的應(yīng)用程序。它的一個(gè)突出的特點(diǎn)是它的計(jì)費(fèi)模式,它確保用戶只在他們的應(yīng)用程序使用GPU資源的持續(xù)時(shí)間內(nèi)收費(fèi)。這意味著當(dāng)你的應(yīng)用程序不被使用時(shí)則不會(huì)收費(fèi)。
Modal還提供每月30美元的優(yōu)惠,為用戶提供了充分的機(jī)會(huì)來探索和試驗(yàn)部署gpu加速的應(yīng)用程序,而無需支付前期費(fèi)用,這也是我們介紹他的一個(gè)原因,因?yàn)槊吭履壳斑€能白嫖30美元哈。
首先安裝:
pipinstallmodal
然后配置modal的運(yùn)行環(huán)境,這一步需要登陸了
modalsetup
我們這里的vllm_modal_deploy.py改編Modal的官方教程。這個(gè)腳本最重要的一點(diǎn)是定義GPU。這里我選擇了nvidia T4,因?yàn)榱炕P头浅P。?
# https://modal.com/docs/examples/vllm_mixtral import os import time from modal import Image, Stub, enter, exit, gpu, method APP_NAME = "example-vllm-llama-chat" MODEL_DIR = "/model" BASE_MODEL = "TheBloke/Llama-2-7B-Chat-AWQ" GPU_CONFIG = gpu.T4(count=1)然后定義運(yùn)行代碼的docker鏡像:?vllm_image = ( # https://modal.com/docs/examples/vllm_mixtral Image.from_registry("nvidia/cuda:12.1.1-devel-ubuntu22.04", add_python="3.10") .pip_install( "vllm==0.3.2", "huggingface_hub==0.19.4", "hf-transfer==0.1.4", "torch==2.1.2", ) .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"}) .run_function(download_model_to_folder, timeout=60 * 20) ) 定義App: stub = Stub(APP_NAME)最后編寫預(yù)測的類:?classModel:@enter()#Lifecyclefunctionsdefstart_engine(self):importtimefromvllm.engine.arg_utilsimportAsyncEngineArgsfromvllm.engine.async_llm_engineimportAsyncLLMEngineprint("coldstartinginference")start=time.monotonic_ns()engine_args=AsyncEngineArgs(model=MODEL_DIR,tensor_parallel_size=GPU_CONFIG.count,gpu_memory_utilization=0.90,enforce_eager=False,#capturethegraphforfasterinference,butslowercoldstartsdisable_log_stats=True,#disableloggingsowecanstreamtokens@enter()裝飾器被用來定義生命周期方法來處理代碼的初始化之類的事情。所以我們?cè)谶@里加載模型并設(shè)置生成管道。如果查詢觸發(fā)了此方法,則意味著有一個(gè)“冷啟動(dòng)”,也就是第一次啟動(dòng)的耗時(shí)會(huì)比較長。 定義生成函數(shù):@stub.function()defgenerate(user_question:str):model=Model()print("Sendingnewrequest:",user_question," ")result=""fortextinmodel.completion_stream.remote_gen(user_question):print(text,end="",flush=True)result+=textreturnresult最后就是使用命令行進(jìn)行部署modaldeployvllm_modal_deploy.py部署完成后就可以從python調(diào)用這個(gè)函數(shù):?importtimeitimportmodalAPP_NAME="example-vllm-llama-chat"f=modal.Function.lookup(APP_NAME,"generate")start_time=timeit.default_timer()print(f.remote("WhatarethenamesofthefourmaincharactersofSouthpark?"))elapsed=timeit.default_timer()-start_timeprint(f"{elapsed=}")
經(jīng)過我的測試第一次啟動(dòng)大約需要37秒。這包括啟動(dòng)時(shí)間和處理時(shí)間。應(yīng)用程序已經(jīng)啟動(dòng)時(shí)的延遲是2.8秒。這些都是在Nvidia T4上運(yùn)行的,所以3秒還是可以接受的。
需要注意:container_idle_timeout的值是用來回收容器的,超過了這個(gè)時(shí)間值會(huì)進(jìn)行回收,這樣再次啟動(dòng)就會(huì)調(diào)用初始化的過程,也就是我們說的冷啟動(dòng)。但是因?yàn)閙odal的計(jì)費(fèi)方式,再未回收前都是計(jì)費(fèi)的,所以請(qǐng)謹(jǐn)慎修改。
最后說下費(fèi)用:Modal的Nvidia T4收費(fèi)是0.000164 * /秒 或 0.59 * /小時(shí)。上面我們使用了幾百秒的計(jì)算時(shí)間,花費(fèi)了大約0.1美元。
5、AnyScale
Anyscale與Modal類似,但他更專注于提供隨時(shí)可用的開源模型。我們可以使用Anyscale API的URL直接調(diào)用它們。
首先注冊(cè)并獲得API密鑰。你可以使用他們提供給新用戶的10*$免費(fèi)套餐來運(yùn)行本教程。
接下來,我們將使用與之前相同的openai_client.py腳本:
exportAPI_KEY="CHANGEME"exportMODEL="meta-llama/Llama-2-7b-chat-hf"exportBASE_URL="https://api.endpoints.anyscale.com/v1"pythonopenai_client.py
不需要任何的設(shè)置,只要我們?cè)诎l(fā)送請(qǐng)求時(shí)修改參數(shù)就可以訪問不同的模型了,這就是Anyscale的優(yōu)勢
這個(gè)請(qǐng)求的延遲大約是3.7秒,還算不錯(cuò)。但是AnyScale是按照令牌來計(jì)費(fèi)的(與OpenAI的API相同)LLama2 7B 的價(jià)格是0.15*$ / 1M 令牌。我們運(yùn)行這個(gè)示例花費(fèi)不到1/10美分。
可以看到AnyScale還是很不錯(cuò)的,對(duì)于開源模型我們直接可以拿來使用,并且花費(fèi)也很低,如果你沒有GPU,這個(gè)可以作為模型測試的首選平臺(tái),一個(gè)月幾十美元基本上夠我們測試當(dāng)月新發(fā)布的所有模型了。
總結(jié)
當(dāng)涉及到服務(wù)大型語言模型(llm)時(shí),有各種各樣的方法可以選擇:
對(duì)喜歡本地服務(wù)器設(shè)置的人來說,使用帶有CPU的Anaconda提供了較低的進(jìn)入門檻,gpu加速的Anaconda環(huán)境可以緩解延遲問題,但它仍然面臨可伸縮性和對(duì)本地資源的依賴方面的限制,特別是在處理大型llm時(shí)。
Docker可以簡化Python環(huán)境配置,可以適應(yīng)大批量的部署。
Modal提供了一種更靈活的按次付費(fèi)計(jì)算解決方案,使其具有成本效益和易于設(shè)置的吸引力。
AnyScale提供了較低的進(jìn)入門檻對(duì)于那些追求簡單的人來說是一個(gè)非常好的選擇。
我們介紹的這些方法是一個(gè)很好的起點(diǎn),還有很多其他服務(wù)比如runpod和AWS,但這些方法需要更多的運(yùn)維知識(shí),并且在小規(guī)模部署上優(yōu)勢并不明顯,所以要考慮對(duì)針對(duì)特定需求和要求量身定制的最佳方案還需要進(jìn)行全面評(píng)估。
-
cpu
+關(guān)注
關(guān)注
68文章
10803瀏覽量
210783 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
8954瀏覽量
85069 -
開源
+關(guān)注
關(guān)注
3文章
3214瀏覽量
42301 -
模型
+關(guān)注
關(guān)注
1文章
3112瀏覽量
48646
原文標(biāo)題:5種搭建LLM服務(wù)的方法和代碼示例
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論