開發高性能的 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 上持續進行預訓練的模型,使用的自定義分詞器經過了希伯來語訓練,然后進一步對齊以用于聊天目的。
設置 TensorRT-LLM
首先,克隆最新版本的 TensorRT-LLM。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的準確性,相比于使用默認的英語校正數據集。
使用校正數據集量化為 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 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。
?