开发高性能的 Hebrew 大语言模型(LLM)带来了独特的挑战,因为 Hebrew 语言本身丰富而复杂。Hebrew 的复杂结构以及通过词根和模式组合形成的词,需要复杂的建模方法。此外,由于 Hebrew 文本中缺乏大写以及频繁缺乏诸如句点和逗号之类的标点符号,因此难以正确分割句子。
例如,单词的多义性和语序的灵活性增加了语言处理的复杂度。例如,单词הקפה可以根据发音表示“coffee”或“encircle”。此外,希伯来语避免使用表示元音的附加符号,这进一步复杂了准确的文本处理和理解。
克服这些独特的语言障碍对于训练能够真正理解和生成高质量希伯来文文本的 AI 模型至关重要。DictaLM-2.0 套件是针对希伯来文的特定语言模型,它基于经典和现代希伯来文文本进行了训练,最近在 Hugging Face Open 排行榜上位列希伯来文语言模型的榜首。
本文介绍了如何使用 NVIDIA TensorRT-LLM 和 NVIDIA Triton Inference Server 大规模优化和加速该模型的推理部署。TensorRT-LLM 是一个全面的开源库,用于编译和优化大语言模型,以便在 NVIDIA GPU 上进行推理。NVIDIA Triton Inference Server 是一个开源平台,可简化和加速人工智能推理工作负载的部署,以创建生产就绪型的大语言模型部署。
什么是低资源语言?
在对话式 AI 的背景下,低资源语言是指那些没有大量数据可用于训练的语言。虽然本文重点介绍希伯来语,但在处理包括东南亚语言在内的低资源语言时,通常也存在同样的挑战。SEA-LION 和 SeaLLM 等语言模型通过针对更好地代表区域文化和语言的特定数据进行训练来解决这些挑战。这两种语言模型都可作为 NVIDIA NIM 微服务提供,目前可在 NVIDIA API 目录中进行原型设计。
大多数 LLM 主要基于英语文本语料库进行训练,这导致了对西方语言模式和文化规范的固有偏见。这样,LLM 难以准确捕捉非西方语言和社会特有的微妙差别、习语和文化语境。
此外,许多非西方语言缺乏高质量的数字化文本数据,这进一步加剧了资源紧缺问题,使LLMs难以在这些语言中有效学习和泛化。因此,LLMs通常无法反映非西方语言固有的文化上适当的表达、情感含义和上下文微妙之处,从而导致潜在的错误解释或有偏见的输出。
现代 LLM 还依赖于统计驱动的标记化方法。由于训练数据集中低资源语言的代表性不足,这些标记化器通常针对每种语言拥有有限的标记集。这会导致这些语言的压缩效率低下。因此,以这些语言生成文本变得更加具有挑战性,并且生成长篇内容需要更多的计算资源和复杂度。
优化工作流程
在第一个优化用例中,我们重点介绍了 DictaLM 2.0 Instruct,这是一个在 Mistral 7B 上持续进行预训练的模型,使用的自定义分词器经过了希伯来语训练,然后进一步对齐以用于聊天目的。
git clone https://huggingface.co/dicta-il/dictalm2.0-instruct
设置 TensorRT-LLM
首先,克隆最新版本的 TensorRT-LLM。TensorRT-LLM 集成了我们在本示例中将要使用的许多高级优化。
git lfs install
git clone -b v0.11.0 https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
拉取 Triton 容器
接下来,拉取具有 TensorRT-LLM 后端的 Triton 推理服务器容器:
docker pull nvcr.io/nvidia/tritonserver:24.07-trtllm-python-py3
docker run --rm --runtime=nvidia --gpus all --volume
${PWD}/../dictalm2.0-instruct:/dictalm-2-instruct --volume
${PWD}:/TensorRT-LLM --entrypoint /bin/bash -it --workdir /TensorRT-LLM
nvcr.io/nvidia/tritonserver:24.07-trtllm-python-py3
创建 FP16 TensorRT-LLM 引擎
将 Hugging Face 检查点转换为 TensorRT-LLM 格式:
python examples/llama/convert_checkpoint.py --model_dir /dictalm-2-instruct/
--output_dir fp16_mistral/ --tp_size 1 --dtype float16
然后构建优化引擎:
trtllm-build --checkpoint_dir fp16_mistral/ --output_dir
fp16_mistral_engine/ --max_batch_size 64 --max_output_len 1024
--paged_kv_cache enable
量化为 INT4,并创建高效的 TensorRT-LLM 引擎
要从更高效的 INT4 数字权重表示中受益,从而节省大量内存带宽和容量,请执行训练后量化 (PTQ)。PTQ 需要有代表性的小型数据集来更新权重,同时保持统计相似性。提供的脚本将提取英语校正数据集,但您也可以更新脚本以提取和使用目标语言中的数据。TensorRT-LLM 在转换为 TensorRT-LLM 格式的同时执行量化。
PTQ 将使模型获得与 FP16 模型相当的结果。预计即使在 PTQ 之后,LLM 的准确度也会有所下降。尽管这超出了范围,但值得一提的是,为了克服任何性能下降的问题,您可以研究量化感知训练,或使用 NVIDIA Transformer 引擎以及更新的 NVIDIA H100 和 NVIDIA B200 GPU 使用 FP8 或 FP4 进行训练。
下载由希伯来语和英语令牌混合组成的Dicta校正数据集。这将显著提高INT4的准确性,相比于使用默认的英语校正数据集。
git clone
https://huggingface.co/datasets/dicta-il/dictalm2.0-quant-calib-dataset
使用校正数据集量化为 INT4:
python3 examples/quantization/quantize.py --kv_cache_dtype fp8 --dtype
float16 --qformat int4_awq --output_dir ./quantized_mistral_int4
--model_dir /dictalm-2-instruct --calib_size 32
然后构建引擎:
trtllm-build --checkpoint_dir quantized_mistral_int4/ --output_dir
quantized_mistral_int4_engine/ --max_batch_size 64 --max_output_len 1024
--weight_only_precision int4 --gemm_plugin float16 --paged_kv_cache enable
使用 Triton 推理服务器部署模型
构建引擎后,您可以使用 Triton Inference Server 部署模型。这将有助于减少设置和部署时间。Triton Inference Server 的 TensorRT-LLM 后端利用 TensorRT-LLM C++ 运行时实现快速推理执行,并包含动态批处理和分页 KV 缓存等技术。您可以通过 NVIDIA NGC 目录将 TensorRT-LLM 后端作为预构建容器访问 Triton Inference Server。
首先,设置 TensorRT-LLM 后端:
git clone -b v0.11.0
https://github.com/triton-inference-server/tensorrtllm_backend.git
cd tensorrtllm_backend
cp ../TensorRT-LLM/fp16_mistral_engine/*
all_models/inflight_batcher_llm/tensorrt_llm/1/
处理自定义的tokenizer 需要采用变通工作流程。在低资源语言的情况下,tokenizer 通常具有不同的词汇表、独特的token映射等。
首先,设置分词器目录:
HF_MODEL=/dictalm-2-instruct
ENGINE_PATH=tensorrtllm_backend/all_models/inflight_batcher_llm/tensorrt_llm/1
python3 tools/fill_template.py -i
all_models/inflight_batcher_llm/preprocessing/config.pbtxt
tokenizer_dir:${HF_MODEL},tokenizer_type:auto,triton_max_batch_size:32,preprocessing_instance_count:1
python3 tools/fill_template.py -i
all_models/inflight_batcher_llm/postprocessing/config.pbtxt
tokenizer_dir:${HF_MODEL},tokenizer_type:auto,triton_max_batch_size:32,postprocessing_instance_count:1
python3 tools/fill_template.py -i
all_models/inflight_batcher_llm/ensemble/config.pbtxt
triton_max_batch_size:32
python3 tools/fill_template.py -i
all_models/inflight_batcher_llm/tensorrt_llm/config.pbtxt
triton_backend:tensorrtllm,triton_max_batch_size:32,decoupled_mode:True,m
ax_beam_width:1,engine_dir:${ENGINE_PATH},max_tokens_in_paged_kv_cache:40
96,max_attention_window_size:4096,kv_cache_free_gpu_mem_fraction:0.5,excl
ude_input_in_output:True,enable_kv_cache_reuse:False,batching_strategy:in
flight_fused_batching,max_queue_delay_microseconds:0
rm -r all_models/inflight_batcher_llm/tensorrt_llm_bls
然后使用 Triton 推理服务器启动:
docker run --rm -it \
-p8000:8000 -p8001:8001 -p8002:8002 \
--gpus 0 \
--name triton_trtllm_server \
-v $(pwd)/dictalm2.0-instruct:/dictalm-2-instruct \
-v $(pwd):/workspace \
-w /workspace \
nvcr.io/nvidia/tritonserver:24.07-trtllm-python-py3 tritonserver \
--model-repository=/workspace/tensorrtllm_backend/all_models/inflight_bat
cher_llm --model-control-mode=NONE --log-verbose=0
使用 Triton 推理服务器进行推理
要向正在运行的服务器发送请求并与之交互,您可以使用其中一个Triton客户端库或向生成的端点发送HTTP请求。
要开始处理简单的请求,请使用以下 curl 命令将 HTTP 请求发送到生成的端点。我们专门提出了一个具有挑战性的问题,需要详细的知识和文化背景:“你有 Yemenite soup 的食谱吗?”
curl -X POST localhost:8000/v2/models/ensemble/generate
-d \
'{
"text_input": "[INST]האם יש לך מתכונים למרק תימני?[/INST]",
"parameters": {
"max_tokens": 1000,
"bad_words":[""],
"stop_words":[""]
}
}'
LLM 会生成包含详细食谱的详细响应。它通过记录通常供应此菜的时间以及几种变体来添加文化语境(图 1)。
性能结果
对于性能实验和测量,我们在单个 NVIDIA A100 GPU 上运行了具有不同加速配置的模型。图 2 显示了通过比较基准 Python 后端(蓝色线)和 Tensor-RT LLM(红线)完成不同数量的 1024 个输出令牌异步请求所需的延迟。非加速的 Python 后端延迟会随着请求数量的增加而增长,而 Tensor-RT LLM 则在整个过程中提供非常有效的扩展性。
结束语
TensorRT-LLM 为许多热门的 LLM 架构提供基准支持,使其能够轻松地使用各种 LLM 进行部署、实验和优化。TensorRT-LLM 和 Triton Inference Server 共同提供了一个集成工具包,用于高效优化、部署和运行 LLM。
要开始使用,请访问 GitHub 上的 NVIDIA/TensorRT-LLM,下载并设置 TensorRT-LLM 开源库,并尝试使用其他多语言 LLM,例如 Baichuan-7B。