Skip to content

LLM tutorial materials include but not limited to NVIDIA NeMo, TensorRT-LLM, Triton Inference Server, and NeMo Guardrails.

License

Notifications You must be signed in to change notification settings

wcks13589/LLM-Tutorial

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LLM Bootcamp - NVIDIA NeMo 大型語言模型訓練實戰教學 🚀

歡迎來到 LLM Bootcamp!本教學將帶您完整體驗使用 NVIDIA NeMo 進行大型語言模型(LLM)的完整流程,從零開始學會模型轉換、預訓練、微調到部署的實戰技巧。

🎯 學習目標

通過本 Bootcamp,您將學會:

  1. 🔄 模型轉換技能:掌握 Hugging Face 與 NeMo 格式間的轉換
  2. 📚 預訓練實踐:體驗大規模語言模型的持續預訓練
  3. 🛠️ 微調技術:學會針對特定任務進行模型微調、掌握 LoRA 等參數高效微調方法
  4. 📊 模型評估:學會評估和測試模型性能
  5. 🚀 模型部署:了解模型導出和部署流程

📂 教學大綱


🛠️ 環境準備

📋 選擇您的環境

在開始訓練之前,您需要設定適合的 GPU 環境。我們提供詳細的環境設定指南:

🌟 TWCC 雲端環境

設定步驟:詳見 📖 TWCC 環境設定指南

🐳 本地 Docker 環境

使用官方 NeMo 容器,包含所有必要的依賴套件:

docker run \
    --gpus all -it --rm --shm-size=8g --ulimit memlock=-1 --ulimit stack=67108864 \
    -v $PWD:$PWD -w $PWD -p 8888:8888 \
    nvcr.io/nvidia/nemo:25.04

💡 提示:您可以在 NGC NeMo Catalog 查看最新版本


📥 專案設置

下載教學專案

git clone https://github.com/wcks13589/LLM-Tutorial.git
cd LLM-Tutorial
pip install -U click

💡 提示:請確保在 LLM-Tutorial 專案目錄中執行後續指令。

🔑 設定 Hugging Face 權限

申請並設定您的 Hugging Face Token:

  1. 申請 Token:前往 Hugging Face Settings 建立新的 Access Token
  2. 設定環境變數
    # 替換為您的實際 Token
    export HF_TOKEN="your_hf_token"
    huggingface-cli login --token $HF_TOKEN

📌 重要:請先在 Hugging Face 申請 Access Token

📖 詳細教學步驟

第一章:模型轉換基礎

1.1 下載預訓練模型

# 下載 Llama 3.1 8B Instruct 模型
huggingface-cli download meta-llama/Llama-3.1-8B-Instruct \
    --local-dir Llama-3.1-8B-Instruct \
    --exclude original/

1.2 轉換為 NeMo 格式

# 設定變數
MODEL=llama3_8b
HF_MODEL_ID=Llama-3.1-8B-Instruct
OUTPUT_PATH=nemo_ckpt/Llama-3.1-8B-Instruct
OVERWRITE_EXISTING=false

# 執行轉換
nemo llm import -y \
    model=${MODEL} \
    source=hf://${HF_MODEL_ID} \
    output_path=${OUTPUT_PATH} \
    overwrite=${OVERWRITE_EXISTING}

檢查點:確認 nemo_ckpt/ 目錄下成功生成了 NeMo 格式的模型檔案


第二章:持續預訓練實戰

2.1 準備訓練資料

下載中文資料集

python data_preparation/download_pretrain_data.py \
    --dataset_name erhwenkuo/wikinews-zhtw \
    --output_dir data/custom_dataset/json/wikinews-zhtw.jsonl

2.2 資料預處理

# 建立預處理目錄
mkdir -p data/custom_dataset/preprocessed

# 使用 NeMo 的資料預處理工具
python /opt/NeMo/scripts/nlp_language_modeling/preprocess_data_for_megatron.py \
    --input=data/custom_dataset/json/wikinews-zhtw.jsonl \
    --json-keys=text \
    --dataset-impl mmap \
    --tokenizer-library=huggingface \
    --tokenizer-type meta-llama/Llama-3.1-8B-Instruct \
    --output-prefix=data/custom_dataset/preprocessed/wikinews \
    --append-eod

2.3 執行預訓練

前置準備

設定基本參數:

JOB_NAME=llama31_pretraining
NUM_NODES=1
NUM_GPUS=1
HF_MODEL_ID=meta-llama/Llama-3.1-8B-Instruct

# 並行處理參數
TP=1  # Tensor Parallel
PP=1  # Pipeline Parallel  
CP=1  # Context Parallel

# 訓練參數
GBS=4          # Global Batch Size
MAX_STEPS=20  # 最大訓練步數(模型權重更新次數)
DATASET_PATH=data/custom_dataset/preprocessed/
方法一:從頭開始預訓練模型

適用情況:當您想要從零開始訓練模型時使用。

特點:腳本會自動從基礎模型架構進行權重初始化

執行指令

python pretraining/pretrain.py \
   --executor local \
   --experiment ${JOB_NAME} \
   --num_nodes ${NUM_NODES} \
   --num_gpus ${NUM_GPUS} \
   --model_size 8B \
   --hf_model_id ${HF_MODEL_ID} \
   --hf_token ${HF_TOKEN} \
   --max_steps ${MAX_STEPS} \
   --global_batch_size ${GBS} \
   --tensor_model_parallel_size ${TP} \
   --pipeline_model_parallel_size ${PP} \
   --context_parallel_size ${CP} \
   --dataset_path ${DATASET_PATH}

重要提醒:本教學內容特別針對 V100 32GB GPU 進行配置優化

由於本教學內容預計使用 V100 32GB 的 GPU 來實作,為確保可以順利執行模型的訓練,我們在 pretrain.py 中特地將模型的層數與維度大幅降低:

模型配置對比

  • 原始 Llama3.1 8B 模型
    • num_layers = 32
    • hidden_size = 4096
    • 參數量: 8B 個參數
  • 調整後配置
    • num_layers = 1
    • hidden_size = 128
    • 參數量:大幅降低,適合單張 V100 GPU

調整原因

  • 確保在 V100 32GB 記憶體限制下能順利執行
  • 降低訓練時間,提供更好的學習體驗
  • 保持完整的訓練流程,讓學習者理解整個預訓練過程

程式碼位置:這些配置調整位於 pretrain.py 中的 configure_recipe 函數內。

具體修改的程式碼

recipe.model.config.num_layers = 1
recipe.model.config.hidden_size = 128

📊 監控訓練:訓練過程中可以觀察 loss 變化來判斷模型學習狀況

方法二:從預訓練模型開始繼續預訓練

⚠️ 注意:此方法在本 Bootcamp 實作中不會執行,由於資源限制,我們專注於方法一的實踐學習。此部分僅供參考和學習使用。

適用情況:當您想要從現有的 NeMo 格式模型開始,進行持續預訓練時使用。

前置條件

  • 需要先將 Hugging Face 模型轉換為 NeMo 格式
  • 確保 ${NEMO_MODEL} 路徑下存在有效的 NeMo 模型檔案

執行指令

NEMO_MODEL=nemo_ckpt/Llama-3.1-8B-Instruct

python pretraining/pretrain.py \
   --executor local \
   --experiment ${JOB_NAME} \
   --num_nodes ${NUM_NODES} \
   --num_gpus ${NUM_GPUS} \
   --model_size 8B \
   --hf_model_id ${HF_MODEL_ID} \
   --nemo_model ${NEMO_MODEL} \
   --hf_token ${HF_TOKEN} \
   --max_steps ${MAX_STEPS} \
   --global_batch_size ${GBS} \
   --tensor_model_parallel_size ${TP} \
   --pipeline_model_parallel_size ${PP} \
   --context_parallel_size ${CP} \
   --dataset_path ${DATASET_PATH}

第三章:指令微調技術

3.1 準備微調資料

# 下載並準備 Alpaca 資料集
python data_preparation/download_sft_data.py

3.2 執行 LoRA 微調

# 微調參數設定
JOB_NAME=llama31_finetuning
NUM_NODES=1
NUM_GPUS=1
HF_MODEL_ID=meta-llama/Llama-3.1-8B-Instruct
NEMO_MODEL=nemo_ckpt/Llama-3.1-8B-Instruct
# LATEST_CHECKPOINT=$(find nemo_experiments/llama31_pretraining/checkpoints/ -type d -name "*-last" | sort -r | head -n 1)
HF_TOKEN=$HF_TOKEN

# 並行處理參數
TP=1
PP=1
CP=1

# 微調參數
MAX_STEPS=10
GBS=4
DATASET_PATH=data/alpaca

# 執行 LoRA 微調
python finetuning/finetune.py \
    --executor local \
    --experiment ${JOB_NAME} \
    --num_nodes ${NUM_NODES} \
    --num_gpus ${NUM_GPUS} \
    --model_size 8B \
    --hf_model_id ${HF_MODEL_ID} \
    --hf_token ${HF_TOKEN} \
    --nemo_model ${NEMO_MODEL} \
    --max_steps ${MAX_STEPS} \
    --global_batch_size ${GBS} \
    --tensor_model_parallel_size ${TP} \
    --pipeline_model_parallel_size ${PP} \
    --context_parallel_size ${CP} \
    --dataset_path ${DATASET_PATH} \
    --peft lora

🎯 全參數微調:若要進行全參數的微調,請移除--peft lora


第四章:Reasoning 資料微調技術

4.1 準備 Reasoning 資料集

# 建立 Reasoning 資料集目錄
mkdir -p data/reasoning_dataset/

# 下載 NVIDIA Llama-Nemotron 後訓練資料集
wget https://huggingface.co/datasets/nvidia/Llama-Nemotron-Post-Training-Dataset/resolve/main/SFT/chat/chat.jsonl -P data/reasoning_dataset/

# 從資料集中選取樣本進行快速訓練
head -n 200 data/reasoning_dataset/chat.jsonl > data/reasoning_dataset/chat_subset.jsonl

4.2 資料預處理與策展

export UCX_MEMTYPE_CACHE=n
export UCX_TLS=tcp

# 執行資料策展與預處理
python data_preparation/curate_reasoning_data.py \
    --input-dir "data/reasoning_dataset" \
    --filename-filter "chat_subset" \
    --remove-columns "category" "generator" "license" "reasoning" "system_prompt" "used_in_training" "version" \
    --json-files-per-partition 16 \
    --tokenizer "meta-llama/Llama-3.1-8B-Instruct" \
    --max-token-count 16384 \
    --max-completion-token-count 8192 \
    --output-dir data/reasoning_dataset/curated-data \
    --device "gpu" \
    --n-workers 1

💡 執行提示:此程式執行過程中可能會出現一些錯誤訊息,但只要輸出資料夾 data/reasoning_dataset/curated-data 內有檔案產生就算執行成功,可以忽略錯誤訊息繼續後續步驟。

4.3 執行 Reasoning LoRA 微調

# Reasoning 微調參數設定
JOB_NAME=llama31_reasoning_finetuning
NUM_NODES=1
NUM_GPUS=1
HF_MODEL_ID=meta-llama/Llama-3.1-8B-Instruct
NEMO_MODEL=nemo_ckpt/Llama-3.1-8B-Instruct
HF_TOKEN=$HF_TOKEN

# 並行處理參數
TP=1
PP=1
CP=1

# 微調參數
MAX_STEPS=10
GBS=4
DATASET_PATH=data/reasoning_dataset/curated-data

# 執行 Reasoning LoRA 微調
python finetuning/finetune.py \
    --executor local \
    --experiment ${JOB_NAME} \
    --num_nodes ${NUM_NODES} \
    --num_gpus ${NUM_GPUS} \
    --model_size 8B \
    --hf_model_id ${HF_MODEL_ID} \
    --hf_token ${HF_TOKEN} \
    --nemo_model ${NEMO_MODEL} \
    --max_steps ${MAX_STEPS} \
    --global_batch_size ${GBS} \
    --tensor_model_parallel_size ${TP} \
    --pipeline_model_parallel_size ${PP} \
    --context_parallel_size ${CP} \
    --dataset_path ${DATASET_PATH} \
    --peft lora \
    --seq_length 1024

🧠 Reasoning 微調特色:使用高品質的推理資料集,提升模型的邏輯推理和複雜問題解決能力


第五章:模型評估與測試

5.1 準備測試資料

# 從測試集中選取樣本進行快速評估
head -n 30 data/alpaca/test.jsonl > data/alpaca/test_subset.jsonl

5.2 執行推理測試

# 使用微調後的模型進行推理
# 找到最新的檢查點資料夾
LATEST_CHECKPOINT=$(find nemo_experiments/llama31_finetuning/checkpoints/ -type d -name "*-last" | sort -r | head -n 1)

python evaluation/inference.py \
    --peft_ckpt_path ${LATEST_CHECKPOINT} \
    --input_dataset data/alpaca/test_subset.jsonl \
    --output_path data/alpaca/peft_prediction.jsonl

5.3 計算評估指標

# 計算模型性能指標
python /opt/NeMo/scripts/metric_calculation/peft_metric_calc.py \
    --pred_file data/alpaca/peft_prediction.jsonl \
    --label_field "label" \
    --pred_field "prediction"

第六章:模型部署與轉換

⚠️ 重要提醒:如果您進行的是 LoRA 微調,請先執行步驟 6.1 合併 LoRA 權重,再進行步驟 6.2 的格式轉換。

6.1 合併 LoRA 權重(僅限 LoRA 微調)

如果您使用了 LoRA 進行微調(在微調指令中包含 --peft lora),您需要先將 LoRA 權重合併回基底模型,然後再進行格式轉換:

# 找到最新的 LoRA checkpoint
LATEST_LORA_CHECKPOINT=$(find nemo_experiments/llama31_reasoning_finetuning/checkpoints/ -type d -name "*-last" | sort -r | head -n 1)
NEMO_MODEL=nemo_experiments/llama31_reasoning_finetuning/checkpoints/nemo_ckpt_merged

# 合併 LoRA 權重到基底模型
python finetuning/merge_lora.py \
    --nemo_lora_model ${LATEST_LORA_CHECKPOINT} \
    --output_path ${NEMO_MODEL}

💡 說明

  • 此步驟會將 LoRA 適配器的權重合併到原始的基底模型中
  • 合併後的模型包含完整的權重,可以獨立使用
  • 如果您進行的是全參數微調,請跳過此步驟

6.2 轉換回 Hugging Face 格式

# 設定轉換參數
# 如果您完成了 LoRA 合併,請使用合併後的模型路徑:
NEMO_MODEL=nemo_experiments/llama31_reasoning_finetuning/checkpoints/nemo_ckpt_merged
# 
# 如果您進行的是全參數微調,請使用:
# NEMO_MODEL=$(find nemo_experiments/llama31_reasoning_finetuning/checkpoints/ -type d -name "*-last" | sort -r | head -n 1)
OUTPUT_PATH=hf_ckpt/

# 執行轉換
nemo llm export -y \
    path=${NEMO_MODEL} \
    output_path=${OUTPUT_PATH} \
    target=hf

第七章:標準化模型評估

7.1 安裝評估工具

使用 EleutherAI 的 lm-evaluation-harness 工具進行標準化模型評估:

# 下載並安裝 lm-evaluation-harness
git clone --depth 1 https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
pip install -e .

7.2 執行標準化評估

使用 LAMBADA OpenAI 任務評估模型的語言建模能力:

# 切換回主目錄
cd ..

# 執行 LAMBADA OpenAI 評估 (僅使用較少樣本進行快速評估)
lm_eval --model hf \
    --model_args pretrained=hf_ckpt/ \
    --tasks lambada_openai \
    --device cuda:0 \
    --batch_size 8 \
    --limit 100

執行結果範例

|    Tasks     |Version|Filter|n-shot|  Metric  |   |Value |   |Stderr|
|--------------|------:|------|-----:|----------|---|-----:|---|-----:|
|lambada_openai|      1|none  |     0|acc       |↑  |0.7100|±  |0.0456|
|              |       |none  |     0|perplexity|↓  |3.4032|±  |0.5080|

結果指標說明

  • acc (準確率):模型正確預測句子最後一個詞的比例,本例為 71%
  • perplexity (困惑度):衡量模型對文本的不確定性,數值越低越好

💡 結果分析:準確率 > 70% 通常表示模型具有良好的語言理解能力

7.3 其他評估任務

您也可以嘗試其他常見的評估任務:

lm_eval --model hf \
    --model_args pretrained=hf_ckpt/ \
    --tasks arc_challenge \
    --device cuda:0 \
    --batch_size 8

📊 評估任務說明

  • LAMBADA OpenAI:測試語言建模和上下文理解能力,評估模型預測句子最後一個詞的準確性
  • ARC (AI2 Reasoning Challenge):測試科學推理能力

🔧 調優提示

  • 可根據 GPU 記憶體調整 batch_size 參數
  • 使用 --limit 參數進行快速測試
  • 詳細的評估結果會顯示準確率和其他相關指標

📚 進階學習資源

官方文檔

進階主題

  1. 多模態模型訓練
  2. 分散式訓練優化
  3. 模型壓縮與量化
  4. 自定義資料載入器

🎉 恭喜完成 LLM Bootcamp!

通過本教學,您已經掌握了:

  • ✅ 大型語言模型的完整訓練流程
  • ✅ NeMo 框架的核心功能
  • ✅ 實際的 AI 模型開發技能
  • ✅ 企業級 AI 應用開發基礎

下一步建議

  1. 嘗試使用自己的資料集
  2. 探索不同的模型架構
  3. 學習模型部署與服務化
  4. 參與開源專案貢獻

💬 需要幫助? 歡迎在 Issues 中提出問題或建議!

Happy Learning! 🚀

About

LLM tutorial materials include but not limited to NVIDIA NeMo, TensorRT-LLM, Triton Inference Server, and NeMo Guardrails.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 7

Languages