如何采用最少的代碼啟動(dòng)LLM API服務(wù)器
譯文譯者 | 李睿
審校 | 重樓
近幾個(gè)月來(lái),開(kāi)源的大型語(yǔ)言模型一直在迅速發(fā)展。Meta公司發(fā)布了LLaMA,隨后又發(fā)布了一系列其他模型,這導(dǎo)致很多企業(yè)運(yùn)行自己的LLM的興趣激增。
擁有自己的LLM(例如LLaMA2)提供了一些優(yōu)勢(shì):企業(yè)可以更好地控制大型語(yǔ)言模型的使用,確保數(shù)據(jù)的隱私,允許定制以適應(yīng)特定需求,并促進(jìn)與現(xiàn)有系統(tǒng)的無(wú)縫集成。然而,企業(yè)運(yùn)行自己的LLM也有許多挑戰(zhàn),其中包括設(shè)置必要的IT基礎(chǔ)設(shè)施,選擇適當(dāng)?shù)腖LM,使用自己的數(shù)據(jù)運(yùn)行并可能微調(diào)模型,擴(kuò)展模型以滿足需求,以及解決許可問(wèn)題。
幸運(yùn)的是,有許多可用的解決方案可以簡(jiǎn)化開(kāi)始使用開(kāi)源LLM的過(guò)程。本文將介紹兩種無(wú)需編寫代碼即可設(shè)置開(kāi)源LLM API服務(wù)器的解決方案。
為什么選擇Web API服務(wù)器?
web應(yīng)用程序和LLM服務(wù)器如何交互
機(jī)器學(xué)習(xí)項(xiàng)目的固有挑戰(zhàn)之一是開(kāi)發(fā)周期長(zhǎng)。當(dāng)企業(yè)希望將LLM功能添加到現(xiàn)有產(chǎn)品中時(shí),將開(kāi)發(fā)和部署模型所需的時(shí)間最小化是至關(guān)重要的。
開(kāi)源LLM尤其具有挑戰(zhàn)性,因?yàn)檫@些大型語(yǔ)言模型是用各種編程語(yǔ)言和框架編寫的。當(dāng)嘗試將這些模型合并到現(xiàn)有應(yīng)用程序中時(shí),這種多樣性可能會(huì)帶來(lái)集成挑戰(zhàn)。
最小化開(kāi)發(fā)和集成時(shí)間的一個(gè)解決方案是建立一個(gè)Web API。如果企業(yè)已經(jīng)在使用像GPT-4或Cohere這樣的商業(yè)LLM API,那么為企業(yè)的開(kāi)源LLM設(shè)置一個(gè)API可以讓企業(yè)在對(duì)現(xiàn)有代碼進(jìn)行最小更改的情況下測(cè)試和比較模型。這種方法提供了在開(kāi)源API和商業(yè)API之間輕松切換的靈活性。
除了集成之外,Web API還可以解決其他挑戰(zhàn)。例如,企業(yè)的Web應(yīng)用程序可能運(yùn)行在無(wú)服務(wù)器或虛擬機(jī)上,而沒(méi)有用于運(yùn)行LLM的專用硬件。
在這種情況下,LLM API允許企業(yè)解耦應(yīng)用程序的不同部分并分別運(yùn)行它們。例如,可以將LLM部署在配備A100 GPU的單獨(dú)虛擬機(jī)上,并使Web服務(wù)器可以通過(guò)API端點(diǎn)訪問(wèn)它。這種解耦意味著隨著模型的開(kāi)發(fā),可以修改底層服務(wù)器并對(duì)其進(jìn)行擴(kuò)展,而無(wú)需對(duì)Web服務(wù)器進(jìn)行任何更改。
需要注意的是,API部署可能不是應(yīng)用程序的最終解決方案。隨著企業(yè)在開(kāi)發(fā)過(guò)程中的試驗(yàn)和進(jìn)展,可能會(huì)發(fā)現(xiàn)將LLM集成到應(yīng)用程序中的更有效的方法。當(dāng)企業(yè)從原型轉(zhuǎn)移到生產(chǎn),保持靈活和開(kāi)發(fā)的方法,因?yàn)榭梢陨钊肓私馄溥x擇的LLM的能力和潛力。
應(yīng)該使用哪種語(yǔ)言模型?
開(kāi)源LLM領(lǐng)域的多樣性也使得為其應(yīng)用程序選擇正確的模型變得困難。LLaMA是一個(gè)很好的起點(diǎn)。其受歡迎程度使其成為一個(gè)引人注目的選擇,因?yàn)樵S多庫(kù)和項(xiàng)目都支持它。此外,已經(jīng)在LLaMA和LLaMA2之上構(gòu)建了許多模型,這意味著如果企業(yè)構(gòu)建的產(chǎn)品可以與其中一個(gè)模型一起工作,那么使其項(xiàng)目適應(yīng)其他模型的可能性很大。
尤其是LLaMA2,其令人印象深刻的基準(zhǔn)在開(kāi)源模型中脫穎而出。如果企業(yè)的目標(biāo)是盡可能接近最先進(jìn)的API LLM,那么LLaMA2可能是其最好的選擇。它也有不同的大小,從70億個(gè)到700億個(gè)參數(shù)不等。這種可擴(kuò)展性允許企業(yè)調(diào)整模型的復(fù)雜性,而無(wú)需對(duì)應(yīng)用程序進(jìn)行重大更改(盡管需要檢查硬件設(shè)置以適應(yīng)模型的大小)。
LLaMA2的另一個(gè)優(yōu)點(diǎn)是其允許商業(yè)使用的許可。這實(shí)際上意味著可以將其用于幾乎任何應(yīng)用程序。許可證中有一些關(guān)于用戶數(shù)量的警告,但這些限制只適用于很少的產(chǎn)品。
然而,一旦企業(yè)使用選擇的模型進(jìn)行了測(cè)試,可能想要探索其他系列LLM。MPT和Cerebras GPT系列模型也具有很高的性能,并且可以為企業(yè)的特定用例提供獨(dú)特的優(yōu)勢(shì)。
在選擇了LLM之后,下一步是找到一個(gè)框架,該框架可以將LLM作為API端點(diǎn)服務(wù),只需很少的編碼或不需要編碼。以下將探討兩個(gè)框架,它們可以幫助企業(yè)快速有效地啟動(dòng)并運(yùn)行LLM API服務(wù)器。
使用vLLM啟動(dòng)API服務(wù)器
vLLM是一個(gè)功能強(qiáng)大的Python庫(kù),可以快速方便地訪問(wèn)各種模型。vLLM由加州大學(xué)伯克利分校的研究人員開(kāi)發(fā),不僅支持LLaMA和LLaMA2,還支持其他先進(jìn)的開(kāi)源語(yǔ)言模型,例如MPT、OPT、Falcon、Dolly和BLOOM。
vLLM最引人注目的特性之一是它運(yùn)行的速度。在一些實(shí)驗(yàn)中,它吞吐量已經(jīng)證明比Hugging Face的LLM要高14~24倍。這種速度加上其現(xiàn)成的API端點(diǎn)功能,使vLLM成為啟動(dòng)語(yǔ)言模型Web API服務(wù)器的高效工具。
要運(yùn)行vLLM,需要一臺(tái)配備Python3.8或更高版本、CUDA 11.0-11.8和合適GPU的Linux服務(wù)器?;蛘撸梢允褂肗VIDIA PyTorch Docker鏡像,該鏡像附帶了所有必要的預(yù)安裝包和庫(kù)。(如果選擇Docker鏡像,必須在使用vLLM之前卸載Pytorch)。
使用一個(gè)簡(jiǎn)單的命令就可以輕松安裝vLLM:
pip install vllm
其安裝過(guò)程可能需要幾分鐘,具體取決于網(wǎng)絡(luò)連接。在安裝之后,啟動(dòng)LLaMA2 API端點(diǎn)就像運(yùn)行以下命令一樣簡(jiǎn)單:
python -m vllm.entrypoints.api_server --env MODEL_NAME=openlm-research/open_llama_13b
該命令在http://localhost:8000上啟動(dòng)服務(wù)器。企業(yè)可以使用-host和-port參數(shù)指定地址和端口,并且可以用自己的模型的名稱替換MODEL_NAME參數(shù)。
要檢查服務(wù)器,可以運(yùn)行curl命令:
curl http://localhost:8000/generate \
-d '{
"prompt": "The most famous book of J.R.R. Tolkien is",
"temperature": 0,
"max_tokens": 50
}'
如果一切正常,應(yīng)該從服務(wù)器接收模型的輸出。
vLLM的主要優(yōu)點(diǎn)之一是它與OpenAI API的兼容性。如果其應(yīng)用程序已經(jīng)與OpenAI模型一起工作,可以運(yùn)行一個(gè)模仿OpenAI API的vLLM服務(wù)器:
python -m vllm.entrypoints.openai.api_server --model meta-llama/Llama-2-13b-hf
之后,只需要改變其代碼指向API調(diào)用到服務(wù)器,而不是OpenAI API:
openai.api_key = "EMPTY"
openai.api_base = "http://localhost:8000/v1"
如果使用-host和-port參數(shù)更改默認(rèn)設(shè)置,可以相應(yīng)地更改api_base變量。
vLLM還支持跨多個(gè)服務(wù)器的并行GPU推理和分發(fā)。如果服務(wù)器有多個(gè)GPU,可以通過(guò)使用tensor-parallel-size參數(shù)輕松調(diào)整vLLM來(lái)利用它們:
python -m vllm.entrypoints.api_server \
--env MODEL_NAME=openlm-research/open_llama_13b \
--tensor-parallel-size 4
這個(gè)特性對(duì)于需要高計(jì)算能力的應(yīng)用程序特別有用。
vLLM的另一個(gè)顯著特性是令牌流。這意味著模型可以在生成輸出標(biāo)記時(shí)返回它們,而不是等待整個(gè)序列完成。如果企業(yè)的應(yīng)用程序生成較長(zhǎng)的響應(yīng),并且不想讓用戶等待很長(zhǎng)時(shí)間,則這一特性特別有用。
但是vLLM并非沒(méi)有其局限性。它不支持LoRA和QLoRA適配器,這是在不修改原始模型權(quán)重的情況下對(duì)開(kāi)源LLM進(jìn)行微調(diào)的常用技術(shù)。vLLM也不支持量化,量化是一種使LLM足夠緊湊以適應(yīng)較小GPU的技術(shù)。盡管存在這些限制,vLLM仍然是快速測(cè)試LLM的非常方便的工具。
創(chuàng)建OpenLLM服務(wù)器
OpenLLM是另一個(gè)廣泛使用的為語(yǔ)言模型創(chuàng)建Web服務(wù)器的平臺(tái)。它以其簡(jiǎn)單性和多功能性而聞名,使其成為開(kāi)發(fā)人員和研究人員的熱門選擇。
要安裝OpenLLM,需要確保其服務(wù)器滿足必要的先決條件。一旦確認(rèn),安裝過(guò)程就很簡(jiǎn)單了。執(zhí)行如下命令:
pip install openllm
在成功安裝后,可以直接從命令行啟動(dòng)服務(wù)器。下面是如何做到這一點(diǎn)的一個(gè)例子:
openllm start llama --model-id openlm-research/open_llama_7b_v2 \
--max-new-tokens 200 \
--temperature 0.95 \
OpenLLM的一個(gè)突出特性是它對(duì)適配器(如LoRA)的支持。該特性允許企業(yè)將完整的LLM和幾個(gè)輕量級(jí)適配器組合在一起,從而使企業(yè)能夠在單個(gè)模型上運(yùn)行多個(gè)應(yīng)用程序。
OpenLLM還與LangChain等流行庫(kù)無(wú)縫集成。這種集成簡(jiǎn)化了編寫應(yīng)用程序或?qū)⒋a移植到新的LLM的過(guò)程,節(jié)省了開(kāi)發(fā)人員寶貴的時(shí)間和精力。
然而,OpenLLM也不是沒(méi)有缺點(diǎn)。與vLLM不同,它不支持批處理推理,這可能成為高使用率應(yīng)用程序的瓶頸。此外,OpenLLM缺乏對(duì)跨多個(gè)GPU的分布式推理的內(nèi)置支持。盡管存在這些限制,OpenLLM仍然是部署語(yǔ)言模型服務(wù)器的健壯且用戶友好的平臺(tái)。它對(duì)于構(gòu)建LLM應(yīng)用程序的原型特別有用,特別是如果想要進(jìn)行LLM微調(diào)的話。
原文標(biāo)題:How to launch an LLM API server with minimal coding,作者:Ben Dickson
鏈接:https://bdtechtalks.com/2023/08/14/llm-api-server-nocode/。