對于在當今全球化商業環境中運營的企業而言,多語種大型語言模型(LLM)的重要性與日俱增。隨著企業跨越國界和文化擴展業務,使用多種語言進行有效溝通的能力對于取得成功至關重要。通過支持和投資多語種 LLM,企業可以打破語言障礙,培養包容性,并在全球市場中獲得競爭優勢。
基礎模型?在處理多語種語言時通常會面臨挑戰。大多數模型主要使用英語文本語料庫進行訓練,這導致了對西方語言模式和文化規范的內在偏見。
這導致 LLM 難以準確捕捉非西方語言和社會特有的細微差別、習語和文化語境。此外,許多低資源語言缺乏高質量數字化文本數據,這進一步加劇了資源緊缺問題,使 LLM 難以跨這些語言進行有效學習和泛化。因此,LLM 通常無法反映非西方語言固有的文化上適當的表達、情感含義和上下文微妙之處,從而導致潛在的錯誤解釋或有偏見的輸出。
根據Meta Llama 3最近的一篇博客文章:“為了為即將推出的多語言用例做好準備,Llama 3 預訓練數據集中有超過 5% 由涵蓋 30 多種語言的高質量非英語數據組成。然而,我們不期望這些語言的性能水平與英語相同。”
在本文中,我們將探索來自不同地區的兩個 LoRA-tuned adapters,并使用 Llama 3 NIM 進行部署,以便NVIDIA NIM在中文和Hindi中表現更好。
與 Llama 3 相比,使用這些適配器提高了這些語言的準確性,因為它們分別在其他中文和 Hindi 文本上進行了專門的微調。此外,我們使用 LoRA 的設計來發揮我們的優勢,因為它在每個模型的較小、低排名矩陣中捕獲所有額外的語言信息。
這使我們能夠為每個各自的 LoRA-tuned 變體加載具有低秩矩陣 A 和 B 的單個基礎模型。在這種方式下,就可以存儲數千個 LLMs,并在最小的 GPU 內存占用下動態高效地運行它們。
教程預備知識
要充分利用本教程,您需要了解 LLM 訓練和推理管線的基本知識,以及基本知識的機器學習和深度學習。
- 擁抱 Face 注冊用戶訪問權限并基本熟悉 transformers 庫。
- Llama3-8B 從 NVIDIA API 目錄指導 NIM,單擊“Run Anywhere with NIM”以部署它。
什么是 NVIDIA NIM?
NVIDIA NIM 是 NVIDIA AI Enterprise 的一部分,是一套易于使用的微服務,旨在加速企業中的生成式 AI 部署。它支持各種 AI 模型,包括 NVIDIA AI 基礎、社區和自定義模型,確保利用行業標準 API 在本地或云端進行無縫、可擴展的 AI 推理。

NIM 提供用于在 AI 模型上運行推理的交互式 API。容器鏡像按模型或模型系列打包(見 Figure 1:)。每個 NIM 都是自己的 Docker 容器,具有一個模型,并且包含一個運行時,該運行時可在具有足夠 GPU 顯存的任何 NVIDIA GPU 上運行。在幕后,NIM 使用 NVIDIA TensorRT-LLM 來優化模型,并為 NVIDIA H100 Tensor Core GPU、NVIDIA A100 Tensor Core GPU、NVIDIA A10 Tensor Core GPU 和 NVIDIA L40S GPU 選擇最佳的專業加速配置文件。
在這篇博客文章中,我們通過動態提供每種語言一個的多個 LoRA 模型來擴展基礎 NIM 的多語種功能。
基礎 LLM 的基本工作流程
NVIDIA NIM 有一組預構建的 LLM,可以輕松設置和服務。以下命令將使用一個 GPU 為 Llama-3-8b-instruct NIM 服務。
docker run -it --rm --name=meta-llama-3-8b-instruct \
--runtime=nvidia \
--gpus all \
-p 8000:8000 \
nvcr.io/nvidia/nim/meta-llama3-70b-instruct:1.0.0
部署完成后,我們可以使用以下命令運行推理:
curl -X 'POST' \
'http://0.0.0.0:8000/v1/completions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "meta/llama-3-8b-instruct",
"prompt": "Once upon a time",
"max_tokens": 64,
}'
在繼續下一步之前,請先停止服務器:
docker stop meta-llama-3-8b-instruct
適用于定制 LLM 的高級工作流程
在非西方語言中,基礎模型的準確性和可靠性不如英語,因為這些語言的訓練數據要少得多。
在這種情況下,可以使用參數高效的微調技術,如 LoRA,來調整預訓練的 LLM,以更好地處理此類語言。
部署多語言 LLM 面臨的挑戰是高效地服務于數百甚至數千個調優模型例如單基礎 LLM(例如 Llama 2)可能會根據每種語言或區域設置擁有許多 LoRA 調優變體標準系統需要獨立加載所有模型,占用大量內存容量
我們特別選擇了 LoRA,因為它通過為每個相應的 LoRA 調整變體加載單個基模型以及低秩矩陣 A 和 B,在每個模型中捕獲較小的低秩矩陣中的所有信息。這樣可以存儲數千個 LLM,并在最小的 GPU 內存占用范圍內動態高效地運行它們。請參閱本文中有關 LoRA 的更多理論背景this post。
NVIDIA NIM 支持使用 HuggingFace 或 NVIDIA NeMo 訓練的 LoRA 適配器,我們將使用這些適配器在 Llama 3 8B Instruct 上為非西方語言添加更可靠的支持。查看此 博客文章,詳細了解如何使用 NIM 部署 LoRA 適配器。
現在,我們將展示如何使用 LoRA 通過多種語言豐富 NIM 功能。
下載模型:
1.如有需要,請安裝 git lfs
git lfs install
2. 從 Hugging Face 克隆中文和印地語 LoRa 調優模型
export LOCAL_PEFT_DIRECTORY=~/loras
mkdir $LOCAL_PEFT_DIRECTORY
pushd $LOCAL_PEFT_DIRECTORY
git clone https://huggingface.co/AdithyaSK/LLama3-Gaja-Hindi-8B-Instruct-alpha
git clone https://huggingface.co/shibing624/llama-3-8b-instruct-262k-chinese-lora
popd
chmod -R 777 $LOCAL_PEFT_DIRECTORY
整理您的 LoRA 模型商店
必須將 LoRA 適配器存儲在單獨的目錄中,并在 LOCAL_PEFT_DIRECTORY 目錄中存儲一個或多個 LoRA 目錄。加載的適配器會自動按照其存儲所在的目錄命名。NVIDIA NIM 為 LLMs 支持 NeMo 和 HuggingFace Transformers 兼容格式。
對于 HuggingFace,LoRA 必須包含 adapter_config.json 文件和其中一個 adapter_model.safetensors 或 adapter_model.bin 文件。NIM 支持的目標模塊是 ["gate_proj", "o_proj", "up_proj", "down_proj", "k_proj", "q_proj", "v_proj"
].
按照以下結構組織LOCAL_PEFT_DIRECTORY
:
loras
├── llama-3-8b-instruct-262k-chinese-lora
│ ├── adapter_config.json
│ └── adapter_model.safetensors
└── LLama3-Gaja-Hindi-8B-Instruct-alpha
├── adapter_config.json
└── adapter_model.safetensors
使用 NIM 部署多個 LoRA 模型
設置了相關 LoRA 調優模型后,我們可以為該模型提供推理服務。這與運行基礎 NIM 類似,但我們現在指定了 LoRA 目錄。
export NIM_PEFT_SOURCE=/home/nvs/loras
export LOCAL_PEFT_DIRECTORY=/home/nvs/loras
export NIM_PEFT_REFRESH_INTERVAL=3600
export CONTAINER_NAME=meta-llama3-8b-instruct
export NIM_CACHE_PATH=~/nim-cache
chmod -R 777 $NIM_CACHE_PATH
NIM 支持加載具有不同秩大小的多個 LoRA,但將上限設置為 32。對于 Hindi LoRA,我們需要將最大秩設置高于默認值,因為此特定模型的調優秩為 64。
export NIM_MAX_LORA_RANK=64
現在,使用 LoRAs 為 NIM 提供服務。該命令類似于運行 Llama 3 基礎模型,但也會加載存儲在 LOCAL_PEFT_DIRECTORY
中的所有 LoRA 模型。
docker run -it --rm --name=$CONTAINER_NAME \
--runtime=nvidia \
--gpus all \
--shm-size=16GB \
-e NGC_API_KEY \
-e NIM_PEFT_SOURCE \
-e NIM_PEFT_REFRESH_INTERVAL \
-e NIM_MAX_LORA_RANK \
-v $NIM_CACHE_PATH:/opt/nim/.cache \
-v $LOCAL_PEFT_DIRECTORY:$NIM_PEFT_SOURCE \
-p 8000:8000 \
nvcr.io/nim/meta/llama3-8b-instruct:1.0.0
服務完成后,我們可以對預先存儲的任何 LoRA 模型運行推理。使用以下命令檢查可用的 LoRA NIM:
url -X GET 'http://0.0.0.0:8000/v1/models'
這將輸出我們現在可以用于推理的所有 LoRA-tuned 模型。
{
"Object":"list",
"Data":[
{"id":
"meta/llama3-8b-instruct","object":"model","created":1717511877,"owned_by":"system","root":"meta/llama3-8b-instruct","parent":null,"permission":[{"id":"modelperm-06017a10c1b1422cb0596baa7fec744d","object":"model_permission","created":1717511877,"allow_create_engine":false,"allow_sampling":true,"allow_logprobs":true,"allow_search_indices":false,"allow_view":true,"allow_fine_tuning":false,"organization":"*","group":null,"is_blocking":false}]},
{"id":"llama-3-8b-instruct-262k-chinese-lora","object":"model","created":1717511877,"owned_by":"system","root":"meta/llama3-8b-instruct","parent":null,"permission":[{"id":"modelperm-ad5ce194c084490ca9f8aa5f23c4fd2f","object":"model_permission","created":1717511877,"allow_create_engine":false,"allow_sampling":true,"allow_logprobs":true,"allow_search_indices":false,"allow_view":true,"allow_fine_tuning":false,"organization":"*","group":null,"is_blocking":false}]},
{"id":"LLama3-Gaja-Hindi-8B-Instruct-alpha","object":"model","created":1717511877,"owned_by":"system","root":"meta/llama3-8b-instruct","parent":null,"permission":[{"id":"modelperm-e11405b8a2f746f5b189de2766336eac","object":"model_permission","created":1717511877,"allow_create_engine":false,"allow_sampling":true,"allow_logprobs":true,"allow_search_indices":false,"allow_view":true,"allow_fine_tuning":false,"organization":"*","group":null,"is_blocking":false}]},
}
使用 NIM 進行推理
使用以下 cURL 命令進行推理,指定 LoRA 模型的名稱::
curl -X 'POST' \
'http://0.0.0.0:8000/v1/completions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "llama-3-8b-instruct-262k-chinese-lora",
"prompt": "介紹一下機器學習",
"max_tokens": 512
}'
以下是結果:
{
"Id":"cmpl-92780e47ef854328a48330d6813e8a26",
"Object":"text_completion",
"Created":1717512584,
"Model":"llama-3-8b-instruct-262k-chinese-lora",
"Choices":[
{
"Index":0,
"text":"算法的基本概念和應用場景?\n\n機器學習算法是一類用于自動處理和分析數據的算法。這些算法可以學習從數據中提取模式、關系和預測性質。在這個回答中,我們將介紹機器學習算法的基本概念和應用場景。\n\n機器學習算法的基本概念:\n\n1. 訓練數據集:機器學習算法學習從數據集中獲取的樣本。\n2. 模型訓練:算法分析訓練數據集,學習模式和關系。\n3. 測試數據集:訓練后的模型評估性能在新的數據集上。\n4. 訓練和測試迭代:重復訓練和測試步驟,以提升算法的準確性。\n\n機器學習算法的應用場景:\n\n1. 數據挖掘:機器學習算法用于發現隱藏在數據中的模式和關系。\n2. 預測和預測分析:算法用于預測未來事件、趨勢和績效。\n3. recommender systems:機器學習算法推薦產品、服務或內容,基于用戶行為和偏好。\n4. 自然語言處理(NLP):機器學習算法用于理解、翻譯和生成人類語言。\n5. 圖像和視頻處理:算法用于圖像和視頻分類、識別和無人機。\n\n總之,機器學習算法是自動處理和分析數據的強大工具。它們可以用于各種應用場景,包括數據挖掘、預測分析和自然語言處理。通過 sürekli 進化和改進,機器學習算法繼續驅動各種 industries 和領域的創新。",
"Logprobs":null,
"Finish_reason":"stop",
"Stop_reason":null}],
"Usage":{
"Prompt_tokens":6,
"Total_tokens":370,
"completion_tokens":364}}
現在我們來試試 Hindi LoRA。
curl -X 'POST' 'http://0.0.0.0:8000/v1/completions' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{
"model": "LLama3-Gaja-Hindi-8B-Instruct-alpha",
"prompt": "??? ???? ??? ??????? ???? ?? ???? ????? ???? ???? ???? ???? ????? ????? ?? ???? ????? ?????",
"max_tokens": 512
}'
結果如下:
{
"Id":"cmpl-ddf3fa6e78fc4d24b0bbbc446fb57451",
"Object":"text_completion",
"Created":1717513888,
"model":"LLama3-Gaja-Hindi-8B-Instruct-alpha",
"Choices":[
{"index":0,
"text":" ????? ????? ??? ???? ?????? ??????? ?? ????????? ?? ???? ??? ???? ???? ??, ????? ?? ???, ??? ?? ?? ??? ?????? ?? ????? ???? ?? ????\n????? ???? ?????, ??????, ?? ????? ?? ????? ????????? ?? ??? ?????? ???? ?? 24 ???? ?? ???????? ???? ?? ??, ?? ?????? ???? ???????????? ?? ???????? ???? ?? ???? ???? ????? ????? ??? ?? ??? ????? ???????? ???? ????, ?? ??? ??? ????? ??? ?? ???? ??????? ?? ?????? ????? ?? ???? ?? ??? ???? ??? ?? ??? ???? ????? ??? ??, ????? ??? ?? ???? ???? ?? ?? ???? ???? ???? ??? ??? ????????? ?? ???????????? ?? ?????? ?? ?? ?????? ???? ??? ??, ?? ?? ?????? ??????????? ??? ??? ??? ??????? ?? ??????? ??????, ????????? ?? ?????? ?? ???? ?????? ??????? ?? ??????? ???? ?? ??? ?????? ???? ????, ???? ???? ??? ????????? ?? ??????? ??? ??? ????? ???\n??? ???? ????????? ????? ?? ????? ???????? ???? ????? ???, ???? ???? ???? ???? ?? ?????? ???? ?? ??????? ????? ????? ???? ?? ???? ???????? ?? ???? ??? ?? ??? ??, ?? ??_epsilon.org ?? ??? ???? ?? ??? ???? ?????? trauma ?? ??? ?? ?????? ??? ?_registers (???????, ??????, ???",
"Logprobs":null,
"Finish_reason":"length",
"Stop_reason":null}],
"Usage":{"prompt_tokens":47,"total_tokens":559,"completion_tokens":512}
}
您還可以使用 LangChain 中的本地服務 NIM。
from langchain_nvidia_ai_endpoints import ChatNVIDIA
llm = ChatNVIDIA(base_url="http://0.0.0.0:8000/v1", model="llama-3-8b-instruct-262k-chinese-lora", max_tokens=1000)
result = llm.invoke("介紹一下機器學習")
print(result.content)
請注意,隨著新版本 NIM 的發布,最新文檔將始終位于https://docs.nvidia.com/nim。
結束語
NVIDIA NIM 使您能夠無縫部署和擴展多個 LoRA 適配器,使開發者能夠添加對其他語言的支持。使用此功能,企業可以在同一基礎 NIM 上為數百個 LoRA 提供服務,動態選擇每種語言的相關 LoRA 適配器。
NVIDIA NIM 入門非常簡單。在 NVIDIA API 目錄中,開發者可以訪問各種 AI 模型,以構建和部署其 AI 應用程序。
使用圖形用戶界面直接在目錄中開始原型設計,或直接與 API 免費交互。要在基礎設施上部署 NVIDIA NIM 推理微服務,請查看《使用 NVIDIA NIM 部署生成式 AI 的簡單指南》。
?