神經機器翻譯(NMT)是一種將一序列的文字從一種語言翻譯成另一種語言的自動任務。近年來,有自注意力機制 Transformer 模型的發展對復雜語言建模任務產生了深遠的影響,這些任務的目標是預測句子中下一個即將出現的分詞,而 NMT 是其中一個典型的應用例子。
在開源社區中有很多 NMT 模型,而在實際使用場景中直接用它們來翻譯文本卻富有挑戰性。一些常見的難點包括:
- 誤譯
- 缺乏語義準確性
- 缺乏特定領域的知識
- 不能處理專有名詞或生僻詞
這些問題的其中一個根因是訓練模型的數據與實際使用場景中的數據分布不匹配。這意味著 模型微調 是一個必要的步驟。
NVIDIA NeMo 是一個端到端的平臺,它可在任何地方開發和定制生成式人工智能,包括 大型語言模型、多模態、視覺以及 語音 AI 等應用。該平臺提供了用于訓練和檢索增強生成(RAG)工具、大模型護欄工具、數據管理工具和各種預訓練模型。NeMo 為企業提供了一種簡單、經濟、快速的方式來使用生成式 AI。
在這篇文章中,我們將介紹使用 NeMo 的前提條件,使用 NeMo 進行預訓練模型推理,并評估預訓練模型的性能。此外,在 第二部分 中,我們將介紹如何定制數據集、數據處理和微調模型的過程。
機器翻譯介紹
自 20 世紀 50 年代以來,機器翻譯一直是受關注的研究領域。在 2010 年前,基于規則和基于統計的機器翻譯是主流的研究方向。基于規則的方法可通過分析源語言和目標語言的形態、句法和語義從而生成翻譯。后來,基于統計的機器翻譯通過使用統計模型來預測目標詞的概率分布而逐步取代了前者。
隨著深度神經網絡在 2010 年代的進步,NMT 已成為如今最流行的翻譯方法。在研究發展的進程中,NMT 的翻譯質量得益于遞歸神經網絡(RNN)、長短期記憶網絡(LSTM)、基于注意力機制的編碼器-解碼器網絡和僅有解碼器的 LLM 模型。
這篇文章使用了兩種 NMT 模型作為示例,分別是 NVIDIA NeMo NMT 和基于大語言模型訓練的 ALMA-NMT,展示了如何在定制數據集上微調模型的過程。
NVIDIA NeMo NMT 模型?
NeMo 使您能夠輕松高效地創建、定制和部署新的生成式人工智能模型。它還為不同的自然語言處理(NLP)任務提供了預訓練模型,如 NMT、自動語音識別(ASR)和文本到語音(TTS)。
NeMo NMT 模型是一些列的雙語翻譯模型,它們具有基于自注意力機制的編碼器-解碼器結構,其中編碼器中有 24 層,解碼器中有 6 層。它們在 NeMo 上使用公開的翻譯數據集進行訓練。

圖片來源: The Annotated Transformer: English-to-Chinese Translator)
ALMA NMT 模型?
ALMA 是一種基于大語言模型(僅有解碼器)的多語言翻譯模型。它對預訓練 LLM 模型,如 Llama 2 ,進行單語語料庫繼續訓練(第 1 階段)。接著,通過使用雙語數據集并應用 低秩適配器(LoRA) 進行微調,以進一步提高性能(第 2 階段)。
與基于編解碼器的模型相比,僅有解碼的模型將 NMT 視為下游任務,將指令提示作為模型輸入的一部分。在預訓練和繼續訓練階段,對模型進行訓練在單語語料庫上進行,并以預測下一個輸出分詞為目標,而雙語數據集僅在 LoRA 微調階段中使用。
NMT 模型定制流程
博客中使用了兩種 NMT 模型,因為它們代表了兩種類型的微調方式:
- NeMo NMT 模型:使用 NeMo 框架訓練和微調而成。
- ALMA 模型:在 HuggingFace 和GitHub 上的開源項目,它在微調中采用了 Accelerate 庫。
兩種方式都有一個相同的定制化流程,但由于訓練框架的差異,在特定步驟上有細微的不同。
接下來的章節會遵循模型微調流程的順序進行敘述:
- 前提條件。
- 運行預訓練 NMT 模型。
- ?NMT 模型評估。
在文章的 第 2 部分 中,我們涵蓋以下步驟:
- 數據收集。
- 數據預處理流程。
- 模型微調。
- 微調模型評估。
模型定制化 的第一步是調研社區上公開的模型,并使用從實際使用場景中收集或模擬生成的一小部分數據集去評估其初始性能。當您發現這些模型都不滿足需求時,就需要進行定制化開發。
數據收集和預處理是定制中必須的步驟,數據質量對最終的微調模型有著巨大的影響。收集的數據應該遵循真實使用場景的分布。它們應該經過預處理以去除異常值,有時也需要進行歸一化。
下一步是在預訓練的模型之上使用處理后的數據集進行微調。在本教程中,我們將使用雙語數據集演示 NeMo NMT 微調和 ALMA 模型 LoRA 微調(第 2 階段)。最后,對微調后的模型再次進行模型評估。
模型定制是一個迭代的過程,直到在實際使用場景中達到滿意的性能。
前提條件
通過 NGC 目錄,您可以訪問 GPU 加速的軟件,這些軟件可以在本地、云端或邊緣部署,從而加快端到端的工作流程。該目錄提供了極高性能的容器、預訓練模型和各個行業專用的 SDK。
在本教程中,我們使用 NGC 目錄中的 NeMo framework 容器 24.01 對 NMT 模型進行微調。
在啟動容器之前,我們推薦您先配置基礎環境:
- NVIDIA GPU(至少 24GB GPU 內存以提高訓練效率)
- 操作系統:Ubuntu 22.04
- 獲取最新的 NVIDIA GPU 驅動程序
- 安裝 Docker Engine
- NVIDIA Container Toolkit
- 獲取 NVIDIA NGC NeMo framework 容器 的訪問權限
生成 NGC API 密鑰,然后登錄 Docker NGC Registry:
docker login nvcr.io ?
Username: $oauthtoken Password: |
使用以下命令啟動 NeMo 框架容器:
docker run - - runtime = nvidia - it - - rm - p 8888 : 8888 - p 6006 : 6006 ? - - shm - size = 16g - - ulimit memlock = - 1 - - ulimit stack = 67108864 nvcr.io / nvidia / nemo: 24.01 .framework |
運行預訓練的 NMT 模型
當您進入 NeMo framwork 容器后,您可以對各種預訓練的 NMT 模型運行推理,并測試它們的初始性能。
運行預訓練 NeMo NMT 模型推理
在 NeMo 容器中下載預訓練的 NeMo NMT 模型并運行推理十分簡單。在此,我們用了 英文到簡體中文的翻譯模型 作為例子。
在 NeMo 框架容器中運行以下 Python 腳本:
from nemo.collections.nlp.models import MTEncDecModel ?
model = MTEncDecModel.from_pretrained( "nmt_en_zh_transformer24x6" ) translations = model.translate([ "AI is powering change in every industry" ], source_lang = "en" , target_lang = "zh" ) ?
print (translations) |
執行結果如下:
[“AI 正在推動每個行業的變革”]
推斷預訓練的 ALMA NMT 模型
ALMA 在 HuggingFace 上提供了經過 LoRA 微調后的模型。為了在 NeMo framework 容器中運行這個模型,需要安裝額外的 peft 依賴,以便加載 LoRA 權重。
pip install peft |
以下是 ALMA 的推理代碼示例:
import torch from peft import PeftModel from transformers import AutoModelForCausa from transformers import LlamaTokenizer ?
# Load base model and LoRA weights model = AutoModelForCausalLM.from_pretrained( "haoranxu/ALMA-7B-Pretrain" , torch_dtype = torch.float16, device_map = "auto" ) model = PeftModel.from_pretrained(model, "haoranxu/ALMA-7B-Pretrain-LoRA" ) tokenizer = LlamaTokenizer.from_pretrained( "haoranxu/ALMA-7B-Pretrain" , padding_side = 'left' ) ?
# Add the source sentence into the prompt template prompt_template = "Translate this from English to Chinese:\nEnglish: {}\nChinese:" prompt = prompt_template. format ( "AI is powering change in every industry" ) ?
# Tokenize input_ids = tokenizer(prompt, return_tensors = "pt" , padding = True , max_length = 40 , truncation = True ).input_ids.cuda() # Inference with torch.no_grad(): ???? generated_ids = model.generate(input_ids = input_ids, num_beams = 5 , max_new_tokens = 256 , do_sample = True , temperature = 0.6 , top_p = 0.9 ) |
結果如下:
['Translate this from English to Chinese:\nEnglish: AI is powering change in every industry\nChinese:
人工智能正在推動各行各業的變革’]
提示模板"Translate this from English to Chinese:\nEnglish: {}\nChinese:"
被用作 LLM 的指令,LLM 的輸出會把這個提示語句補充完整。您還必須對輸出進行后處理,以提取實際翻譯結果。
NMT 模型評估
我們可通過對預訓練模型的評估更深入了解模型的表現和以及對微調結果的有所預期。
通常,機器翻譯質量的評估采用 雙語評估替補(BLEU)算法,該算法通過比較 n-gram 匹配來衡量生成的翻譯文本和參考文本之間的相關性。其評估分數范圍從 0 到 1,分數越高,表示兩者相關性越大。
NeMo 框架容器已安裝了 sacrebleu
庫,可用于基準測試并得出 BLEU 分數:
sacrebleu reference.txt - i generated.txt - m bleu - b - w 4 |
這個 generated.txt
文件是機器生成的翻譯,而 reference.txt
是參考譯文。這兩個文件每一行都是一一對應的關系。在這個執行命令時,使用了以下參數:
-m bleu
表示使用 BLEU 標準來評估模型性能。-b
表示僅輸出 BLEU 的評估分數。-w 4
表示顯示小數點后4位。
您可以從實際使用場景中收集定制一個雙語數據集作為評估集,使用上一章中提及的推理代碼為數據集生成翻譯,并評估預訓練的模型性能。
對于 NeMo NMT 模型,NeMo 框架提供了用于逐行翻譯文件的腳本。以下命令將預訓練的英文到中文的 NeMo 翻譯模型,并評估其對 input_en.txt
文件的性能。
# Download the pretrained en-zh NeMo model mkdir - p model / pretrained_ckpt wget - O en_zh_24x6. zip - - content - disposition "https://api.ngc.nvidia.com/v2/models/nvidia/nemo/nmt_en_zh_transformer24x6/versions/1.5/zip" unzip en_zh_24x6. zip - d model / pretrained_ckpt rm en_zh_24x6. zip ?
# Translation script python / opt / NeMo / examples / nlp / machine_translation / nmt_transformer_infer.py \ ??? - - model model / pretrained_ckpt / en_zh_24x6.nemo \ ??? - - srctext input_en.txt \ ??? - - tgtout pretrained_nemo_out_zh.txt \ ??? - - source_lang en \ ??? - - target_lang zh \ ??? - - batch_size 200 \ ??? - - max_delta_length 20 ?
sacrebleu reference.txt - i pretrained_nemo_out_zh.txt - m bleu - b - w 4 |
input_en.txt
記錄了英文文本。pretrained_nemo_out_zh.txt
記錄了模型輸出的中文翻譯。reference.txt
為參考譯文。
總結
在這篇文章中,我們向您展示如何使用 NeMo 并評估其性能。在 第二部分 中,我們將指導您完成數據定制的過程,并使用 LoRA 微調模型。
?