玄界のGPUを最大限活用する方法
thSolution Architecture and Engineering, NVIDIA | Aug 23 2024​

AGENDA•

Transformer Engine 概要•

NeMo Framework 概要•

その他のTips•

Transformer Engine 概要

NVIDIA H100
Unprecedented Performance, Scalability, andSecurity for Every Data Center

Highest AI and HPC Performance​
4PF FP8 (6X)| 2PF FP16 (3X)| 1PF TF32 (3X)| 60TF FP64​ (3.4X)
3.35TB/s (1.5X), 80GB HBM3 memory​*

Transformer Model Optimizations
6X faster on largest transformer models​Highest Utilization Efficiency and Security
7 Fully isolated & secured instances, guaranteed QoS​
2nd Gen MIG | Confidential Computing

Fastest, Scalable Interconnect​
900 GB/s GPU-2-GPU connectivity​ (1.5X)
128GB/s PCI Gen5​*NVIDIA H100 SXMは94GB HBM2eモデルも存在します

FP8, FP16, TF32 performance include sparsity. X-factor compared to A100

NVIDIA Hopper

The Engine for the World’s AI Infrastructure

World’s Most
Advanced Chip

Confidential
Computing

NVIDIA AI Enterprise is a 5-Year Subscription

Transformer
Engineth
4 Gen

NVLinkH100 SXM

2nd Gen MIG

DPX Instructions

H100 NVL

FP8
フォーマットハードウェア命令
FP8 Tensor Core• 8bit精度のGEMM• 16bitの2倍のFLOPS• 32x of FFMA (64x with 2:4 sparsity)• 4種のFP8フォーマットの組み合わせに対応• E4M3xE4M3, E5M2xE5M2, E4M3xE5M2, E5M2xE4M3• 出力はFP16 or FP32

• タイプ変換• 8-bit <-> 32-bit/16-bit• FP8 -> FP16
• FP16/FP32 -> FP8

FP8の利点• 計算の高速化• FP8 Tensor Coreは16bit Tensor Coreの2倍の演算速度• メモリアクセスの高速化• 16bit -> 8bitによるメモリトラフィックの削減• 推論環境へのデプロイが容易• FP8で学習済みのモデルは量子化による影響を受けにくいFP16とFP8におけるMixed Precisionの違い
Scaling Factor• FP16: 単一のScaling factorをbackward passにのみ用いる• Scaling factorの変更はOverflow/Underflow発生時に行う• FP8: Tensor毎にScaling factorを持つ• Scaling factorはforward/backward両方に対して必要• E4M3 for forward, E5M2 for backward• 単一のScaling factorでは精度を担保できないTransformer Engine
FP8のためのライブラリ• Transformerブロックを高速に学習するためのオープンソースライブラリ• FP8に最適化されたOperator• PyTorch, JAX, PaddlePaddleをサポート• 各フレームワークのNative Operatorと組み合わせ可能• 分散学習のための各種Parallelismをサポート• https://github.com/NVIDIA/TransformerEngine最近の新機能
Since last GTC

最近の新機能
Since last GTC

インストール方法• pipでインストール• pip install git+https://github.com/NVIDIA/TransformerEngine.git@stable• NGC containerを使用• docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:24.04-py3

Transformer Engine API
Transformerを構成するモジュール• FP8 supported modules• te.Linear (nn.Linear compatible)• te.LayerNorm (nn.LayerNorm compatible)• Optimized core attention• te.DotProductAttention• Fused/combined modules• te.LayerNormLinear• te.LayerNormMLP• te.MultiHeadAttention• te.TransformerLayerTransformer Engine
FP8 autocast# Enable autocasting to FP8.
with te.fp8_autocast(enabled=True,
fp8_recipe=fp8_recipe):
out = model(inp)loss = out.sum()loss.backward()• fp8_autocast context managerの内部ではTransformer EngineのOperatorでFP8を使用するようになる• FP8 recipeでhistory windowの長さ、Scaling factorの計算に用いるアルゴリズムなどを指定可能• モデルのうちTransformer Engineのモジュールで構成された部分以外は変更されない• FP16/FP8のmixed precision trainingのためには、FrameworkのAMPと組み合わせる or モデル自体を16bitでロードする• Backward passは fp8_autocast の外側で実施する必要あり（FP8のrecipeはforward passのものを引き継ぐ）

既存のモデルへの適用
Linear/LayerNorm の置き換え• nn.Linear / nn.LayerNormを
te.Linear / te.LayerNorm に1:1置き換え• モジュールの階層構造、state_dictは完全に互換• モデル作成後に簡単に置き換えることができ、変換コードがモデルアーキテクチャに依存しない

BertAttention

BertAttention

BertSelfAttention

BertSelfAttention

query: nn.Linear

query: te.Linear

key: nn.Linear

key: te.Linear

value: nn.Linear

value: te.Linear

BertSelfOutput

BertSelfOutput

dense: nn.Linear

dense: te.Linear

LayerNorm: nn.LayerNorm

LayerNorm: te.LayerNorm

BertIntermediate

BertIntermediate

dense: nn.Linear

dense: te.Linear

BertOutput

BertOutput

dense: nn.Linear

dense: te.Linear

LayerNorm: nn.LayerNorm

LayerNorm: te.LayerNorm• Transformer以外でもLinearを含むモデルに適用可能• te.TransformerLayer を使う場合と比較すると、若干パフォーマンスは落ちる• HF accelerate / PyTorch Lightningなどの3rd-party
libraryでFP8を使用する場合は自動的にこの方式でモデルが変換される

BertLayer

BertLayer

for name, module in model.named_children():
if isinstance(module, nn.Linear):te_module = te.Linear(
module.in_features, module.out_features)te_module.weight.copy_(module.weight)
te_module.bias.copy_(module.bias)
setattr(model, name, te_module)
elif isinstance(module, nn.LayerNorm):
te_module = te.LayerNorm(...

既存モデルへの適用
te.TransformerLayer を継承• te.TransformerLayer を継承して引数/入出力/weightをオリジナルのLayer実装とマッピングする• 最適化された実装による最大のパフォーマンス
• FP8を使用しないケースにおいても多くのOSS実装より高速でメモリ効率が良い• 高速・省メモリなAttention実装• Flash Attention, CuDNN Attention• モジュール構造が変わるため、モデル毎の実装やパラメータのマッピングが必要

class TELlamaLayer(te.TransformerLayer):def __init__(self, config, layer_idx: int):
super().__init__(config.hidden_size,
config.intermediate_size,
config.num_attention_heads,
activation=“swiglu”,
normalization=“RMSNorm”,...)
def forward(self, inputs, attention_mask, ...):
return super().forward(
inputs, attention_mask, ...)

Huggingface Llama2における公式チュートリアル
https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/te_llama/tutorial_accelerate_hf_llama_with_te.html

サードパーティライブラリ経由での利用
Huggingface Accelerate / PyTorch Lightning• 自動でモデルの一部をTransformer Engineのモジュールに変換し、fp8_autocast ラップする• モデル変換はLayerNorm / Linearを1:1で置き換え• Transformer Engineのモジュールに置き換えられた部分以外のprecisionは各ライブラリの実装に依存
from accelerate import Accelerator
from accelerate.utils import FP8RecipeKwargs

Huggingface Accelerate:

kwargs = [FP8RecipeKwargs(backend="te", ...)]
accelerator = Accelerator(mixed_precision="fp8", kwarg_handlers=kwargs)

model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare(model, optimizer, train_dataloader, eval_dataloader, lr_scheduler)# Select 8bit mixed precision via TransformerEngine, with model weights in bfloat16
trainer = Trainer(precision="transformer-engine")

PyTorch Lightning:# Select 8bit mixed precision via TransformerEngine, with model weights in float16
trainer = Trainer(precision="transformer-engine-float16")# Customize the fp8 recipe or set a different base precision:from lightning.trainer.plugins import TransformerEnginePrecision
recipe = {"fp8_format": "HYBRID", "amax_history_len": 16, "amax_compute_algo": "max"}
precision = TransformerEnginePrecision(weights_dtype=torch.bfloat16, recipe=recipe)trainer = Trainer(plugins=precision)

NeMo / Megatron-Coreでの利用最も簡単なTransformer Engineの利用方法• Megatron-CoreのGPT系モデルはTransformer Engineが組み込まれている• YAMLまたはCLIのフラグで指定するだけで適用可能
by CLI:python /opt/NeMo/examples/nlp/language_modeling/megatron_gpt_pretraining.py \--config-path /opt/NeMo-Megatron-Launcher/launcher_scripts/conf/training/gpt3 \--config-name 1b_improved \model.transformer_engine=True \model.fp8=True

by YAML: model:## Transformer Engine
transformer_engine: True
fp8: True# enables fp8 in TransformerLayer forward
fp8_e4m3: False# sets fp8_format = recipe.Format.E4M3
fp8_hybrid: True
# sets fp8_format = recipe.Format.HYBRID
fp8_margin: 0# scaling margin
fp8_interval: 1# scaling update interval
fp8_amax_history_len: 1024 # Number of steps for which amax history is recorded per tensor
fp8_amax_compute_algo: max # 'most_recent' or 'max'. Algorithm for computing amax from history
fp8_wgrad: True
ub_tp_comm_overlap: False
tp_comm_atomic_ag: False
tp_comm_atomic_rs: Falseパフォーマンス向上のためのTips• Master weightがFP32の場合、FP16/BF16のmixed precisionをかならず併用する• te.fp8_autocast のみを使った場合、Linear/LayerNormはFP8で計算されるが他はFP32になる• モデルを16bitで読み込んでいる場合(full bf16/fp16 training)、特別な対応は不要• Transformerの各LayerだけではなくOutput(token classification) Dense Layerもte.Linearにしておく• Language Modelingの場合、多くのケースで最も大きいDense Layer• FP8 Tensor Coreを使うためにはvocab_sizeを16の倍数にする必要あり• Gradient accumulationの活用• FP8のscalingとweightの更新はgradient accumulationの最初のiterationのみで行われる• オーバーヘッドの削減

FP8での推論
3つの方法• PyTorch + TransformerEngine• パフォーマンス面では推奨されないが、モデル学習中のクイックな検証には有用• 学習中のEvaluationであれば、Training loopと同じように fp8_autocast で囲むだけで使用できる• FP8で学習していないモデルをFP8で推論する場合、Scaling factorの事前キャリブレーションが必要• キャリブレーション完了後であれば、FP8のweightのみロードすることも可能• ONNX -> TensorRT export• Transformer EngineはONNXにエクスポートするためのhelper methodが実装されている• 主にLLM以外の推論向け• TensorRT LLM / NIM LLM• 特定のLLMアーキテクチャ向けに最もパフォーマンスの良い方法• TP/PP/EPなど各種Parallelismに対応• TensorRT LLMは独自のPost-Training Quantization機能を持っているため、TEで学習したScalingは使わない• FP8 Post-Training Quantization on TRT-LLM doc:
• https://github.com/NVIDIA/TensorRT-LLM/blob/v0.9.0/examples/llama/README.md#fp8-post-training-quantization

Performance Results
GEMM onlyPerformance Results
GPT-3 model using NeMo Megatron, H100 FP8 vs A100 FP16/BF16

End -to-end training throughput comparison, results gathered using BigNLPcontainer version 23.02 on 8 nodes (64 GPUs).

精度への影響• 多くのモデルで16bit trainingと比較して大きな差分は観測されていない• FP8 for Deep Learning(GTC2023): https://www.nvidia.com/en-us/on-demand/session/gtcspring23-s52166/

Useful Links• Github: https://github.com/NVIDIA/TransformerEngine• Documentation: https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/• GTC Sessions:• FP8 for Deep Learning(GTC23):
https://www.nvidia.com/en-us/on-demand/session/gtcspring23-s52166/• FP8 Training with Transformer Engine(GTC23):
https://www.nvidia.com/en-us/on-demand/session/gtcspring23-S51393/• What's New in Transformer Engine and FP8 Training(GTC24):
https://www.nvidia.com/en-us/on-demand/session/gtc24-s62457/• Japanese blog: https://developer.nvidia.com/ja-jp/blog/introduction-to-fp8-training-using-transformer-engine/NeMo Framework 概要

企業向け生成 AI アプリケーションの構築
NVIDIA NeMo による生成 AI モデルの構築、カスタマイズ、展開
NeMo Microservices

NeMo Framework
データ
キュレーション

分散学習モデル
カスタマイズ

推論の高速化

Retrieval Augmented
Generation

ガードレール…

NeMo Curator

Megatron Core

NeMo Aligner

NVIDIA NIM

モデル開発

NeMo Retriever
Microservice

NeMo Guardrails

エンタープライズアプリケーションの展開

NVIDIA NeMo
NVIDIA AI Enterprise

NVIDIA DGX CloudNVIDIA NeMo Framework

生成 AI モデル構築、カスタマイズの為のエンドツーエンドのクラウドネイティブなフレームワーク

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/nemo

https://github.com/NVIDIA/NeMo

NVIDIA NeMo Framework

生成 AI モデル構築、カスタマイズの為のエンドツーエンドのクラウドネイティブなフレームワーク
NeMo Framework コンテナ

データ
キュレータ

分散学習

高速な推論処理

顧客
データ

結果

✓データの収集、キュレーション✓高度な分散学習技術• Data Parallelism• Fully Sharded Data Parallelism (FSDP)• Tensor Parallelism• Pipeline Parallelism• Sequence Parallelism• Expert Parallelism• Context Parallelism✓最適なハイパーパラメータを見つけるための自動コンフィギュレータツール✓カスタマイズ手法のサポート• PEFT, SFT, RLHF, DPO, SteerLM etc.

NVIDIA DGX SuperPODs
NVIDIA DGX Cloud
NVIDIA DGX Systems

https://developer.nvidia.com/nemo-framework✓オーケストレータのサポート: SLURM, Nephele, Kubernetes✓充実したサンプルコードや補助スクリプト✓モダリティを超えたサポートの拡大• LLMs• Multimodal (text2image, VLMなど)• SpeechNeMoのインストール手順

NGC

Github• example:• example:• docker pull nvcr.io/nvidia/nemo:24.05

apt-get update && apt-get install -y libsndfile1 ffmpeg
pip install Cython
pip install nemo_toolkit['all']• その他、Github上にpip(モダリティ指定)やソースビルド、
dockerでの構築手順がありますNVIDIA NeMo Frameworkのコンテナ構成
NGC Pytorch
コンテナ
NVIDIA GPU に最適化された
PyTorch コンテナ

Megatron LM(Megatron Core)
3Dパラレルによる分散学習

Transformer
EngineFP8活用を中心にTransformerモデルの高速化

ammo

NeMo
(LLM, Multimodal,
Speech)生成AI開発の為のフレームワーク

NeMo Framework
Launcher
オンプレ、クラウドのクラスタ環境での学習・推論起動スクリプト、AutoConfigurator

NeMo-Aligner
効率的にモデルを調整する為のツールキット
StreerLM、RLHFなどカスタマイズ手法をサポート

モデル量子化のためのツールキット

PyTorch Lightning

NeMo Curator
データキュレーションツールキット…
24.05 コンテナでの構成
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/nemo

NeMo Framework
コンテナ

Megatron-LM と NeMo Framework

https://www.nvidia.com/ja-jp/on-demand/session/gtc24-s61626/

データキュレーションがモデルのパフォーマンスを向上
LLMのための大規模で高品質なデータセットを可能にするNeMo Curator• 非構造化データソースを検索する負担を軽減• データをダウンロードし、ドキュメントの抽出、クリーニング、
重複排除、フィルタリングを大規模に実行

インターネット規模のデータセット

文書レベルの品質
フィルタリング

NeMo Curator のステップ
1. データのダウンロード、言語検出、テキスト抽出 - HTMLおよび
LaTeXファイル
2. テキストの再フォーマットとクリーニング - 不正なユニコード、
改行、繰り返し

データダウンロード
言語検出 テキスト抽出

タスクの重複3. GPUアクセラレーションによるドキュメントレベルの重複排除• ファジー重複排除• 正確な重複排除

4. 文書レベルの品質フィルタリング

テキストの再フォーマットクリーニング

データブレンド

ドキュメントレベルの重複排除

トレーニング• クラシファイアベースのフィルタリング• ヒューリスティックに基づく多言語フィルタリング

5. タスク重複排除 - ドキュメント内の重複排除を実行します。

https://github.com/NVIDIA/NeMo-Curator

分散学習• Data Parallelism• 各デバイスはモデルパラメータの複製を持つ• 入力データを複数のGPUに分割し、Iteration毎に重み勾配をall-reduceする• Model Parallelism• モデルパラメータを複数のGPUに分割• Tensor Parallelism: 個々のレイヤーを複数のGPUに分割。各デバイスはレイヤー0,1,2,3の異なる部分を計算する。
• Pipeline Parallelism: 複数のGPUにレイヤーを分割。レイヤー0,1とレイヤー2,3は異なるGPU上にある

https://www.nvidia.com/ja-jp/on-demand/session/gtc24-s61626/

Model Parallelism• Tensor Parallelism• 各TransformerレイヤーのすべてのMLPとself-attentionブロックをGPU間で分割する• 各レイヤの1回のフォワードパスとバックワードパスで4回のall-reduceが必要。
• 通信負荷が高いため、ノード内通信（NVLink）が望ましい• Pipeline Parallelism• 複数のGPUにレイヤーを分割。Pipeline ParallelismはPipelineバブルをもたらす• Interleaved Pipeline• 各GPUは、レイヤーの連続したセットではなく、レイヤーの複数のサブセット（モデルチャンクと呼ばれる）に対して計算を実行。レイヤ
0,1,4,5とレイヤ2,3,6,7は異なるGPU上にある• バブルの割合をモデルチャンクの数だけ減らす• ステージ間のpoint-to-point通信が必要だが、これはall-reduceの通信コス
トに比べるとはるかに安いため、ノード間通信（IBなど）が使える

https://arxiv.org/pdf/1909.08053
https://arxiv.org/pdf/2104.04473

Memory Saving• Sequence Parallelism• LayerNormとDropoutをシーケンス次元に沿って分割し、activation
memoryを削減• 4 reduce-scatter + 4 all-gather ( ~ 4 all-reduce)を (Tensor Parallelism)
1回のフォワードとバックワードで行う• Activation Recomputation• メモリに保存する代わりに、バックワードパス中にactivationを再計算。
• Full activation recomputation• Transformerレイヤーのすべての活性化を再計算• 必要なメモリを大幅に削減できるが、30～40%の計算オーバーヘッドが発生• Selective activation recomputation• 計算量とメモリのトレードオフに基づいて、再計算するactivationを選
択• activationのメモリフットプリントを低減し、再計算のオーバーヘッド
をわずかに低減• Distributed Optimizer/ZeRO• Data Parallel GPU間でモデルの状態（オプティマイザの状態: 1、勾配:
2、モデルパラメータ: 3）を共有• ZeRO3では通信量が増える可能性あり• Offloading• CPUのメモリを利用することでGPUのメモリ要件を削減するが、GPUCPU-GPUの転送オーバヘッドを伴う• 勾配、パラメータ、オプティマイザの状態をCPUにオフロード• フォワードパスの後にGPUからCPUにactivationをオフロードし、バッ
クワードパスの前にCPUからGPUにプリフェッチバックする

LLMのパラメータは増加傾向
新しい風を吹き込むTransformerモデル• Llama2, Mistral, GPT等代表的なLLMのActive Parameter数とそのロードに必要なメモリサイズは以下の通り• 注: 以下はあくまでParameterのロードに必要なメモリのみの数値

Model
Llama 2 7B
Llama 2 13B
Llama 2 70B
Mistral 7B
Mixtral 8x7B
GPT3 175B

Active Parameter
7B
13B
70B
7B
13B
175B

FP32
28GB
52GB
280GB
28GB
188GB
700GB

FP16/BF16
14GB
26GB
140GB
14GB
94GB
350GB

代表的なLLMの事前学習
モデル

発表時期

モデルサイズ(B)

事前学習
データサイズ

ハードウェア

学習時間

OPT (Meta)

May-2022

175

180B Token

992 80G A100-

BLOOM (BigScience)

Nov-2022

176

366B Token

384 80G A100

105日

PLaMo
(Preferred Networks)

Sep-2023

13

1.4T Token

480 40G A100

約30日

LLaMA (Meta)

Feb-2023

65

1.4T Token

2048 80G A100

21日

2T Token??? 80GB A100

1.72 M GPU hours(1×A100 GPU)
2048で35日ほど--

Llama 2 (Meta)

Jul-2023

70

Llama 3 (Meta)

Mar-2024

70

15T Token

24000 80GB
H100

MT-NLG (MS/NVIDIA)

Jan-2022

530

270B Token

4480 80G A100

モデルがGPUに載らない？
分散学習の必要性

MT-NLGは530Bパラメータ• モデルをすべてメモリにロードするだけで単純計算で1,060 GB (in BF16)• 8 x A100 (80GB) サーバが、2台（16 GPU）必要• ワーキングメモリも当然必要
Q: 実際どうやって扱っているのか？
A: 4,480 x A100 GPUs (560 nodes)のクラスタ上で、一つのモデルを280 GPUs（8-way tensor parallel & 35-way
pipeline parallel=35 nodes）に分割（Model Parallelism）
して、それを16個複製（Data Parallelism）している

https://developer.nvidia.com/blog/using-deepspeed-and-megatron-to-train-megatron-turing-nlg-530b-theworlds-largest-and-most-powerful-generative-language-model/

3D Parallelismによる分散学習 (NVIDIA Megatron)
Efficient Large-Scale Language Model Training on GPU Clusters, Deepak Narayanan et al., 2021
Data Parallelism:
ノード間通信(IB)

Dataparallelism
on 6 groupsof 64 nodes

TP(8) × PP(64) × DP(6) =Pipeline Parallelism:
Tensor Parallelism:
ノード内通信 (NVLINK)
Communication-Intensive

Pipeline parallelism on 64 nodes

ノード間通信(IB)How to Run Pretraining on NeMo Framework?

https://docs.nvidia.com/nemo-framework/user-guide/latest/playbooks/pretraining.html

NeMo のモデルカスタマイズツール群
大規模言語モデルをユースケースに合わせてカスタマイズする方法

データ、計算資源、投資

特定のユースケースにおける精度
PROMPT ENGINEERING
•

技術

•
•

•

利点
•

•

•

課題

Few-shot learning
Chain-of-thought reasoning
System prompting

事前に訓練されたLLMを活用した良好な結果最も低い投資額最も少ない専門知識
事前に訓練されたLLMに、多くのスキルやドメイン固有のデータを追加することはできない。

PROMPT LEARNING••

Prompt tuning
P-tuning

PARAMETER EFFICIENT FINE-TUNING
•

•
•

•

•

•

•

事前に訓練されたLLMを活用
したより良い結果
低投資
古いスキルを忘れない
すべてのモデルパラメータを変更する包括的な能力が少な
い

•

•

•

•

•

Adapters
LoRA
IA3
事前に訓練されたLLMを活用した最高の結果
古いスキルを忘れない

中程度の投資トレーニングに時間がかかる
より多くの専門知識が必要

FINE TUNING
•

•
•

•

•

•

•

•

SFT
RLHF (PPO), DPO, SPIN
SteerLM
事前に訓練されたLLMを活用した最高の結果
すべてのモデルパラメータを変更
古いスキルを忘れる可能性
多額の投資
専門知識が最も必要Prompt Learning
Prompt Tuning vs P-Tuning

Prompt Tuning
Embeddingのみ更新可能な特殊トークンのプロンプトを修正 。

P-Tuning
小規模な LSTM (Long Short-Term Memory) モデルを使用して、トークンの固定プロンプトの埋め込みを予測します。

ファインチューニングするパラメータがほとんどなくなります。

さらに多くのパラメーターをチューニングする必要があります。

ターゲットのタスクに適応する能力は限られていますが、ハードウェア
リソースにかかるコストは低くなります。

精度は向上しますが、ハードウェア リソースは増加します。

アダプターベースの手法
Adapter, LoRA, IA3

Adapter

低ランク適応 (LoRA)

各Transformer層に挿入し、Adapterの重みだけを更新

高密度層のランク分解行列を最適化

https://arxiv.org/abs/1902.00751

https://arxiv.org/abs/2106.09685

IA3
Adapterと似ているが、Key, Value, またはFFN内のレイヤ をスケーリングするベクトル

https://arxiv.org/abs/2205.05638

How to Run PEFT training on NeMo Framework?

https://docs.nvidia.com/nemo-framework/user-guide/latest/playbooks/llama2peft.html

教師ありファインチューニング(SFT, Instruction-Tuning)
LLMのZero-shotパフォーマンスを向上させる学習手法

https://arxiv.org/pdf/2109.01652

How to Run SFT on NeMo Framework?

https://docs.nvidia.com/nemo-framework/user-guide/latest/modelalignment/sft.html#step-2-sft-training属性スコアを利用したLLMの制御: SteerLM
推論中に LLM をカスタマイズする手法

1. 人間が注釈を付けたデータセットで予測モデルを
トレーニングし、有用性、ユーモア、創造性などの任意の数の属性に関する応答品質を評価します。
2. 属性スコアを予測してさまざまなデータセットに注釈を付け、モデルで利用できるデータの多様性を豊かにします。
3. LLM をトレーニングする事でユーザーが認識する質や有用性などの属性の指定された組み合わせに基づいた応答を生成するようにファインチューニングします。
4. ブートストラップトレーニングは、最大の品質に基づいて多様な応答を生成することによるモデルサン
プリングを通じて行われ、それらに対して微調整を行うことでさらなる適合性向上を図ります。

https://huggingface.co/nvidia/SteerLM-llama2-13B
https://arxiv.org/abs/2310.05344

How to Run SteerLM on NeMo Framework?

https://docs.nvidia.com/nemo-framework/user-guide/latest/modelalignment/steerlm.html

Useful Link

• NVIDIA NeMo Framework• https://docs.nvidia.com/nemo-framework/user-guide/latest/overview.html• NeMo• https://github.com/NVIDIA/NeMo• NeMo-Aligner• https://github.com/NVIDIA/NeMo-Aligner/tree/mainその他の Tips

玄海上でGPUデバッグ
その他の Tips• ここからは玄海上でGPUの稼働状況等々確認する方法等、いくつか有益(だと思われる)情報をいくつかご紹介しようと思います。

nvidia-smi

nvidia-smi を動かす
もっとも原始的なGPU稼働状況の確認方法#!/bin/bash#PJM -L rscgrp=b-batch#PJM -L gpu=1#PJM -j#PJM -L elapse=0:03:00
source /etc/profile.d/modules.shsource ./ddp-test/bin/activate
nvidia-smi --querygpu=timestamp,temperature.gpu,utilization.gpu,utilization.memory,memory.used,memory.free --format=csv-l 1 > nvidiasmi.log &\NVIDIA_SMI_PID=$!
torchrun --nnodes 1 --nproc_per_node 2 ./examples/distributed/ddp-tutorial-series/multigpu_torchrun.py
50 10kill $NVIDIA_SMI_PID
Reference: /home/pj24001778/share/samples/genkai-example-nv/01_nvidiasmi/run_ddp.shnvidia-smi を動かす
もっとも原始的なGPU稼働状況の確認方法#!/bin/bash#PJM -L rscgrp=b-batch#PJM -L gpu=1#PJM -j#PJM -L elapse=0:03:00
source /etc/profile.d/modules.shsource ./ddp-test/bin/activate

nvidia-smi --help-query-gpuで取得可能なクエリが確認できます

nvidia-smi --querygpu=timestamp,temperature.gpu,utilization.gpu,utilization.memory,memory.used,memory.free --format=csv-l 1 > nvidiasmi.log &\NVIDIA_SMI_PID=$!
torchrun --nnodes 1 --nproc_per_node 2 ./examples/distributed/ddp-tutorial-series/multigpu_torchrun.py
50 10kill $NVIDIA_SMI_PID
Reference: /home/pj24001778/share/samples/genkai-example-nv/01_nvidiasmi/run_ddp.shNGC container

NGC Catalog
NVIDIAコンテナでより高速にアプリケーションを構築

開発期間の短縮

パフォーマンスの最適化

Save OpEx and eliminate
developers’ time and effort onbuilding containers with rightdependencies

Updated Monthly

Download pre-built containers
for a variety of use-cases

Better performance on thesame system

Scalable

どこでもデプロイ
Docker | cri-o | containerd |Singularity
Bare metal, VMs, Kubernetes
Multi-cloud, on-prem, hybrid, edge

エンタープライズレディ
Production branches

Regular releases of security patchesEnterprise support with SLAs

NGC Catalog
NVIDIA GPUに最適化されたコンテナ (PyTorch24.04コンテナの例)

https://docs.nvidia.com/deeplearning/frameworks/pytorchrelease-notes/rel-24-04.html#rel-24-04

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags

NGC Catalog
NVIDIA GPUに最適化されたコンテナ (PyTorch24.04コンテナの例)

https://docs.nvidia.com/deeplearning/frameworks/pytorchrelease-notes/rel-24-04.html#rel-24-04

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags

玄界 はコンテナの実行が可能です
NGCコンテナを動かすと再現性等々便利な場合も…

#!/bin/bash#PJM -L rscgrp=b-batch#PJM -L gpu=2#PJM -j#PJM -L elapse=0:10:00#PJM -L jobenv=singularity
source /etc/profile.d/modules.shmodule load singularity-ce/4.1.3
export WORKDIR=/home/${GROUP}/share/containers
TORCH_CONTAINER_IMAGE=${WORKDIR}/pytorch_24.04-py3.sif
echo $TORCH_CONTAINER_IMAGE
singularity run --nv $TORCH_CONTAINER_IMAGE bash -c "torchrun --nnodes 1 --nproc_per_node 2./examples/distributed/ddp-tutorial-series/multigpu_torchrun.py 50 10"

Reference:/home/pj24001778/share/samples/genkai-example-nv/02_container/run_ddp.shNsight Systems

Nsight Systems
System Profiler

Key Features:•System-wide application algorithm tuning• Multi-process tree support•Locate optimization opportunities• Visualize millions of events on a very fast GUI timeline• Identify gaps of unused CPU and GPU time

•Balance your workload across multiple CPUs and GPUs
• CPU algorithms, utilization and thread state
GPU streams, kernels, memory transfers, etc•Command Line, Standalone, IDE Integration•OS: Linux (x86, Power, ARM Server, Tegra), Windows, macOS X(host)•GPUs: Pascal+•Docs/product: https://developer.nvidia.com/nsight-systems

CPU
utilization
Processes &threads
OS runtime
APIs
NVTX
annotations

CUDA &
cuBLAS APIs

GPU CUDA
Kernels & memorytransfers

NVTX projected on
GPU CUDA streams

CPU IP &backtrace
sample data

Additionally
Trace:• TensorRT• Direct3D11,12,DXR• Vulkan• OpenGL• OpenACC• MPI• OpenMP• Ftrace• ETW• WDDM• GPU Context Switch
Export:• SQLite• HDF5• JSON
Architectures:• X86_64• Power• Arm SBSA
• Tegra68

NVIDIA Tools Extensions (NVTX)
C, C++, & Python
Decorate application source code with annotations (markers, ranges, nested ranges, …)
Help visualize execution with debugging, tracing and profiling tools
https://github.com/NVIDIA/NVTX/tree/release-v3/#include <nvtx3/nvToolsExt.h>MarkernvtxMark("This is a marker");Push-Pop range
nvtxRangePush("This is a push/pop range");// Do something interesting in the range
nvtxRangePop();

Start-End range// Somewhere in the code:
nvtxRangeHandle_t handle = nvtxRangeStart("This is a start/end range");// Somewhere else in the code, not necessarily same thread as Start call:
nvtxRangeEnd(handle);

Advanced concepts like colors, domain, category…
API references https://nvidia.github.io/NVTX/doxygen/index.html and https://nvidia.github.io/NVTX/doxygen-cpp/index.html
69

NVIDIA Tools Extensions (NVTX)
https://github.com/NVIDIA/NVTX/blob/release-v3/python/docs/index.rst

アプリケーションのソースコードをアノテーション、プロファイリングツールによる実行の可視化。C, C++, & Pythonに対応
https://github.com/NVIDIA/NVTX/tree/release-v3/
pip install nvtx で簡単インストール(pythonの場合)# example_lib.py
import time
import nvtx

def sleep_for(i):time.sleep(i)@nvtx.annotate()
def my_func():
time.sleep(1)with nvtx.annotate("for_loop", color="green"):for i in range(5):sleep_for(i)my_func()70

NVIDIA SDKs and NVTX
A Complete Ecosystem

Holoscan SDK

DeepStream SDK
Accel. GStreamer
Plugins

Math Libraries

GXF

GXF

Deep Learning Libraries

cuSPARSE

Comm. Libraries…

NVSHMEM

cuDF

NCCL

cuFileTensorRT
cuSOLVER

cuBLAS

cuDNN

cuDLA

cuML

nsys コマンドを利用
Nsight Systems でプロファイリングするにはプログラム全体のプロファイリング結果を result.qdrep に出力する場合

nsys profile –f true -o result -t cublas,cuda,cudnn,nvtx,openacc,osrt \python main.py ...
※ 長時間実行すると、非常に巨大なプロファイリング結果ファイルが生成されます！！

GPU Profiling Overview ( 基礎編 )https://docs.nvidia.com/nsight-systems/UserGuide/index.html#cli-profilingNsight Systems を使ってみる
NVIDIA 純正 GPU プロファイラ#!/bin/bash#PJM -L rscgrp=b-batch#PJM -L gpu=2#PJM -j#PJM -L elapse=0:10:00#PJM -L jobenv=singularity
source /etc/profile.d/modules.shmodule load singularity-ce/4.1.3
export WORKDIR=/home/${GROUP}/share/containers
TORCH_CONTAINER_IMAGE=${WORKDIR}/pytorch_24.04-py3.sif
echo $TORCH_CONTAINER_IMAGE
singularity run --nv $TORCH_CONTAINER_IMAGE bash -c "nsys status -e && nsys profile -f true -o nsys-test-t osrt,cuda,cudnn,nvtx torchrun --nnodes 1 --nproc_per_node 2 ./examples/distributed/ddp-tutorialseries/multigpu_torchrun.py 50 10"
Reference:/home/pj24001778/share/samples/genkai-example-nv/03_nsys/run_ddp.shNsight Systems を使ってみる
NVIDIA 純正 GPU プロファイラ• nvtxによるラベルの可視化例

NeMo Framework/Megatron-LMNeMo Framework/Megatron-LM/Megatron Corewandb インテグレーション
NeMo Framework/Megatron-LM/Megatron Core

• Wandbとは？
• Weights & Bias 社の MLOpsプラットフォーム。実験結果の監視、GPUを含めたシステムメトリック情報など様々な機能を提供• `pip install wandb`でインストール後、`wandb login`して使用• 詳細はhttps://docs.wandb.ai/quickstartを参照ください• NeMo Framework/Megatron-LMはwandbインテグレーション済であり、yamlまたは起動引数で指定するだけで簡単にwandb連携が可能です
NeMo Frameworkの場合以下のフラグを起動時に指定

exp_manager.create_wandb_logger=True \exp_manager.wandb_logger_kwargs.project=${PJ_NAME} \exp_manager.wandb_logger_kwargs.name=${EXP_NAME} \※Megatron-LM の情報は以下をご参照下さい
https://github.com/NVIDIA/Megatron-LM/blob/c4d12e26b2dc25a2eab7da92e2ac30338c0ed3de/examples/gpt3/gpt_config.yaml#L295

wandb インテグレーション
NeMo Framework/Megatron-LM/Megatron Core
Wandb による可視化例

Megatron Timer
NeMo Framework/Megatron-LM/Megatron Core

• Megatron Core には学習の各処理時間をログに吐き出すTimer機能があり、Yamlまたは起動引数でTimer機能をONに出来る。学習のデバッグ時に便利

https://github.com/NVIDIA/MegatronLM/commit/680b67c881b7b14a7bda32228f739fc27e88b429

https://github.com/NVIDIA/NeMo/pull/8354

Megatron Timer
NeMo Framework/Megatron-LM/Megatron Core

• NeMo Framework の場合以下のように指定することでTimerを有効化できる

export HYDRA_FULL_ERROR=1
singularity run --nv -B $USER_DIR $NEMO_CONTAINER_IMAGE \torchrun --nproc_per_node=${NGPU_PER_NODE} \/opt/NeMo/examples/nlp/language_modeling/tuning/megatron_gpt_finetuning.py \trainer.precision=bf16 \(..snip..)+model.enable_megatron_timers=True \++model.megatron_timer_kwargs.log_option=max \(..snip..)

Timer ON 時の出力

参考: https://github.com/NVIDIA/NeMo/blob/677203ab36d743c3398158f0f1d5fba552306993/examples/nlp/language_modeling/conf/megatron_gpt_config.yaml#L223

Appendix.
その他のTips 関連リンク
Nsight Systems• GPU Profiling Overview ( 基礎編 )• Nsight Systems ユーザーガイド
NGC Catalog• https://catalog.ngc.nvidia.com/• NGC Catalog ユーザーガイド
Megatron-LM• https://github.com/NVIDIA/Megatron-LM
NeMo Framework• NeMo Frameworkコンテナ (NGC catalog)• NeMo Framework ドキュメンテーション• NeMo Framework Examples
Wandb• https://docs.wandb.ai/quickstart
玄界用サンプルコード• /home/pj24001778/share/samples/genkai-example-nv/• /home/pj24001778/share/samples/genkai-example-nv/README.md