3 月 19 日下午 2 点,锁定 NVIDIA AI 网络中文专场。立即注册观看
生成式人工智能/大语言模型

使用 NVIDIA NIM 实现多语种大语言模型部署

对于在当今全球化商业环境中运营的企业而言,多语种大型语言模型(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 训练和推理管线的基本知识,以及基本知识机器学习和深度学习。

什么是 NVIDIA NIM?

NVIDIA NIMNVIDIA AI Enterprise 的一部分,是一套易于使用的微服务,旨在加速企业中的生成式 AI 部署。它支持各种 AI 模型,包括 NVIDIA AI 基础、社区和自定义模型,确保利用行业标准 API 在本地或云端进行无缝、可扩展的 AI 推理。

A diagram showing NVIDIA NIM architecture.
图 1. NVIDIA NIM 架构,具有通用基础、Llama3-8b-Instruct 的配置层以及用于服务的单个命令

NIM 提供用于在 AI 模型上运行推理的交互式 API。容器镜像按模型或模型系列打包(见 Figure 1: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 的简单指南》

 

标签