Qwen3 を NeMo で単一 GPU 学習するチュートリアル
本文の状態
日本語全文を表示中
詳細モードで約10分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
MarkTechPost
MarkTechPost は、Google Colab で NVIDIA NeMo AutoModel を使い、Qwen3-0.6B モデルを LoRA でファインチューニングする完全なワークフローを紹介している。
AI深層分析を開く2026年8月5日 18:56
AI深層分析
キーポイント
単一 GPU 環境での実装可能性の証明
記事は Google Colab の単一 GPU リソースのみを使用して、NVIDIA NeMo AutoModel を用いた Qwen3-0.6B の LoRA 微調整を成功させる具体的な手順を示している。
構成駆動型アーキテクチャの検証
分散マルチ GPU 環境へスケーリング可能な設定駆動型のトレーニングアーキテクチャを、制約のある Colab ランタイム向けにプログラムで調整する手法が解説されている。
NeMo AutoModel の統合と API 活用
NVIDIA-最適化された実行パスを維持しつつ、Hugging Face と互換性のあるモデルインターフェースを提供する NeMoAutoModelForCausalLM の Python API 利用法が実証されている。
ワークフローの自動化と検証
CUDA ハードウェアの確認から、NeMo AutoModel のソースからの直接インストール、LoRA チェックポイントの生成・読み込み、およびモデル出力の比較までを含むエンドツーエンドの自動化が記述されている。
単一GPU環境へのレシピ適応
bfloat16非対応環境では精度をfloat32に自動切り替え、バッチサイズを制限してColabのハードウェア制約に対応する。
重要な引用
In this tutorial, we build an end-to-end NVIDIA NeMo AutoModel workflow in Google Colab and use a single GPU to explore the same configuration-driven training architecture that scales to distributed multi-GPU environments.
We verify the available CUDA hardware and precision support, install NeMo AutoModel directly from its source repository, load an official Qwen3-0.6B LoRA fine-tuning recipe
use NeMoAutoModelForCausalLM through the Python API to demonstrate how NeMo AutoModel integrates NVIDIA-optimized execution paths while preserving the familiar Hugging Face model interface.
"We verify that the Colab runtime provides a CUDA-enabled GPU and inspect its name, memory capacity, and bfloat16 support."
編集コメントを表示
編集コメント
このチュートリアルは、大規模な AI 開発ツールを個人のリソースで試すための現実的な橋渡し役を果たしている。NVIDIA の技術が実際の開発現場の制約下でもどのように機能するかを示す貴重なケーススタディと言える。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
本チュートリアルでは、Google Colab で NVIDIA NeMo AutoModel のエンドツーエンド・ワークフローを構築し、単一の GPU を用いて、分散マルチ GPU 環境へもスケーリング可能な設定駆動型のトレーニングアーキテクチャを探求します。利用可能な CUDA ハードウェアと精度サポートを確認した後、ソースリポジトリから直接 NeMo AutoModel をインストールします。続いて、公式の Qwen3-0.6B LoRA 微調整レシピを読み込み、Colab の制約されたランタイムに合わせて、精度やバッチサイズ、チェックポイント設定、スケジューラーのパラメータをプログラムで動的に調整します。
その後、automodel コマンドラインインターフェースを通じてパラメータ効率の高い微調整(LoRA)を実行し、生成された LoRA チェックポイントの場所を確認して再読み込みします。さらに、元のモデルと微調整後のモデルから出力される結果を比較検証します。最後に、Python API を通じて NeMoAutoModelForCausalLM を使用し、NeMo AutoModel が NVIDIA 最適化の実行パスを取り入れつつも、馴染み深い Hugging Face のモデルインターフェースを維持している仕組みを実演します。
Colab ワークスペースとシェルヘルパーのセットアップ
コードをコピーして実行してください(ブラウザを変更することも可能です)。
import os, sys, glob, json, subprocess, shutil, textwrap
REPO_DIR = "/content/Automodel"
WORK_DIR = "/content/automodel_demo"
CKPT_DIR = os.path.join(WORK_DIR, "checkpoints")
os.makedirs(WORK_DIR, exist_ok=True)
def sh(cmd, check=True):
print(f"\n$ {cmd}\n" + "-" * 78)
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, text=True, bufsize=1)
for line in p.stdout:
print(line, end="")
p.wait()
if check and p.returncode != 0:
raise RuntimeError(f"Command failed ({p.returncode}): {cmd}")
return p.returncode
ファイル操作、プロセス実行、パス管理、そして整形された出力のために必要な Python ライブラリを読み込みます。また、本ワークフロー全体で使用するリポジトリディレクトリ、作業用ディレクトリ、チェックポイント保存先のディレクトリを定義しています。さらに、コマンドの実行結果をストリーミング表示し、実行に失敗した場合はエラーを抛出する再利用可能なシェルコマンド関数 sh も用意しました。
GPU の確認と NeMo AutoModel のインストール
コピーコード(Copied)
別のブラウザを使用
print("=" * 78)
print("STEP 0 — GPU ランタイムの確認")
print("=" * 78)
import torch
assert torch.cuda.is_available(), (
"GPU が検出されません!Colab の場合:ランタイム -> ランタイムタイプの変更 -> GPU を選択してください。"
)
GPU_NAME = torch.cuda.get_device_name(0)
BF16_OK = torch.cuda.is_bf16_supported()
VRAM_GB = torch.cuda.get_device_properties(0).total_memory / 1e9
print(f"GPU: {GPU_NAME} | VRAM: {VRAM_GB:.1f} GB | bf16 サポート:{BF16_OK}")
print("\n" + "=" * 78)
print("STEP 1 — NeMo AutoModel のインストール(数分かかります)")
print("=" * 78)
if not os.path.isdir(REPO_DIR):
sh(f"git clone --depth 1 https://github.com/NVIDIA-NeMo/Automodel.git {REPO_DIR}")
sh(f"pip -q install -e {REPO_DIR}")
sh("pip -q install pyyaml peft")
sh('python -c "import nemo_automodel; print(\'NeMo AutoModel version:\', '
'getattr(nemo_automodel, \'__version__', \'source\'))"')
Colab のランタイムに CUDA 対応の GPU が用意されているか確認し、その機種名やメモリ容量、bfloat16 のサポート状況を確認します。NVIDIA NeMo AutoModel のリポジトリが存在しない場合はクローンして取得し、ソースコードからパッケージを直接インストールします。その後、依存ライブラリの YAML と PEFT をインストールし、NeMo AutoModel が正常にインポートできるか確認します。
Qwen3 の LoRA レシピの読み込みとパッチ適用
コピー コピー済み
別のブラウザを使用する
print("\n" + "=" * 78)
print("STEP 2 — レシピの準備")
print("=" * 78)
import yaml
candidates = sorted(glob.glob(
os.path.join(REPO_DIR, "examples", "llm_finetune", "qwen", "*0p6b*peft*.yaml")
)) or sorted(glob.glob(
os.path.join(REPO_DIR, "examples", "llm_finetune", "**", "*peft*.yaml"),
recursive=True,
))
assert candidates, "クローンしたリポジトリ内に PEFT のレシピが見つかりません。"
BASE_RECIPE = candidates[0]
print(f"基本レシピ:{os.path.relpath(BASE_RECIPE, REPO_DIR)}")
with open(BASE_RECIPE) as f:
cfg = yaml.safe_load(f)
print("\n--- 元のレシピ(そのままの状態) ---")
print(yaml.dump(cfg, sort_keys=False)[:2500])
def patch(node):
if isinstance(node, dict):
for k, v in list(node.items()):
if isinstance(v, str) and not BF16_OK and v.lower() in (
"bf16", "bfloat16", "torch.bfloat16"):
node[k] = "float32"
elif k in ("batch_size", "local_batch_size") and isinstance(v, int):
node[k] = min(v, 4)
elif k == "global_batch_size" and isinstance(v, int):
node[k] = min(v, 8)
else:
patch(v)
elif isinstance(node, list):
for item in node:
patch(item)
patch(cfg)
cfg.setdefault("step_scheduler", {})
cfg["step_scheduler"]["max_steps"] = 40
cfg["step_scheduler"]["ckpt_every_steps"] = 40
cfg["step_scheduler"]["num_epochs"] = 1
if isinstance(cfg.get("checkpoint"), dict):
cfg["checkpoint"]["enabled"] = True
cfg["checkpoint"]["checkpoint_dir"] = CKPT_DIR
DEMO_RECIPE = os.path.join(WORK_DIR, "qwen3_0p6b_colab_lora.yaml")
with open(DEMO_RECIPE, "w") as f:
yaml.dump(cfg, f, sort_keys=False)
print("\n--- 修正後のレシピ(実際に実行する内容) ---")
print(yaml.dump(cfg, sort_keys=False)[:2500])
MODEL_ID = "Qwen/Qwen3-0.6B"
try:
MODEL_ID = cfg["model"]["pretrained_model_name_or_path"]
except Exception:
pass
print(f"\n基本モデル:{MODEL_ID}")
公式の PEFT レシピを見つけて YAML 設定を読み込み、元のトレーニング設定を確認します。その後、Colab の単一 GPU で実行できるように精度やバッチサイズのパラメータを再帰的に調整しつつ、レシピの構造自体は維持します。さらに、トレーニング時間の制限を設定し、チェックポイントの出力先を指定して修正済みのレシピを保存、Hugging Face 上のモデル ID を抽出します。
HellaSwag データセットでの LoRA 微調整の実行
print("\n" + "=" * 78)
print("STEP 3 — Training (LoRA fine-tune of Qwen3-0.6B on HellaSwag)")
print("=" * 78)
env_prefix = "HF_HUB_ENABLE_HF_TRANSFER=0 TOKENIZERS_PARALLELISM=false"
rc = sh(f"cd {WORK_DIR} && {env_prefix} automodel {DEMO_RECIPE}", check=False)
if rc != 0:
print("\nRetrying with legacy CLI syntax...")
sh(f"cd {WORK_DIR} && {env_prefix} automodel finetune llm -c {DEMO_RECIPE}")NeMo AutoModel のコマンドラインインターフェースを通じて、HellaSwag データセット上で Qwen3-0.6B の LoRA 微調整を開始します。Colab での実行をより予測可能にするため、不要な Hugging Face の転送機能やトークナイザーの並列処理機能をオフにしています。また、メインのコマンドが失敗した場合に備えて、古い NeMo AutoModel CLI 構文に対応するフォールバックコマンドも用意されています。
ベースモデルと微調整済みモデルの出力比較
print("\n" + "=" * 78)
print("STEP 4 — Evaluating: base model vs LoRA fine-tuned model")
print("=" * 78)
from transformers import AutoModelForCausalLM, AutoTokenizer
DTYPE = torch.bfloat16 if BF16_OK else torch.float32
PROMPT = ("A man is sitting on a roof. He starts pulling up roofing shingles. "
"What happens next?")
def generate(model, tok, prompt, max_new_tokens=60):
inputs = tok(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
out = model.generate(**inputs, max_new_tokens=max_new_tokens,
do_sample=False, temperature=None, top_p=None,
pad_token_id=tok.eos_token_id)
return tok.decode(out[0][inputs["input_ids"].shape[1]:],
skip_special_tokens=True)
tok = AutoTokenizer.from_pretrained(MODEL_ID)
base = AutoModelForCausalLM.from_pretrained(
MODEL_ID, torch_dtype=DTYPE, device_map="cuda")
print("\n[BASE MODEL]")
print(textwrap.fill(generate(base, tok, PROMPT), 90))
ckpt_glob = sorted(glob.glob(os.path.join(CKPT_DIR, "**", "model"),
recursive=True))
if not ckpt_glob:
ckpt_glob = sorted(glob.glob(os.path.join(WORK_DIR, "**",
"adapter_model.safetensors"),
recursive=True))
ckpt_glob = [os.path.dirname(p) for p in ckpt_glob]
if ckpt_glob:
ADAPTER_DIR = ckpt_glob[-1]
print(f"\nFound checkpoint: {ADAPTER_DIR}")
try:
from peft import PeftModel
tuned = PeftModel.from_pretrained(base, ADAPTER_DIR)
print("\n[FINE-TUNED MODEL (base + LoRA adapter)]")
print(textwrap.fill(generate(tuned, tok, PROMPT), 90))
except Exception as e:
print(f"\nCould not auto-load the adapter with peft ({e}).")
print("Inspect the checkpoint contents manually:")
for p in glob.glob(os.path.join(ADAPTER_DIR, "*"))[:20]:
print(" ", p)
else:
print("\nNo checkpoint found — check the training logs above.")
del base
torch.cuda.empty_cache()
まず、トークナイザーとベースとなる因果言語モデルを読み込み、決定論的な応答を生成して比較の基準(ベンチマーク)を設定します。次に、微調整中に作成された最新の LoRA チェックポイントまたはアダプターファイルを検索し、PEFT を用いてこれらをモデルに適用します。その後、微調整後の応答を生成して評価を行い、GPU メモリを解放します。
NeMo AutoModel Python API の使用
print("\n" + "=" * 78)
print("STEP 5 — Bonus: drop-in Python API")
print("=" * 78)
try:
from nemo_automodel import NeMoAutoModelForCausalLM
nm = NeMoAutoModelForCausalLM.from_pretrained(
MODEL_ID, torch_dtype=DTYPE).to("cuda")
print("[NeMoAutoModelForCausalLM]")
print(textwrap.fill(generate(nm, tok, "The key idea of LoRA is"), 90))
del nm
torch.cuda.empty_cache()
except Exception as e:
print(f"Python-API demo skipped on this version/GPU: {e}")
print("\n" + "=" * 78)
print("DONE! Where to go next:")
print("=" * 78)
print(f"""
- Recipes を探索する (REPO_DIR/examples/内):
llm_finetune/ — Llama, Qwen, Gemma, Phi, GPT-OSS などへの SFT + LoRA
llm_pretrain/ — FineWeb での nanoGPT や DeepSeek-V3 の事前学習など
vlm_finetune/ — Qwen-VL, Gemma-3-VL、その他のビジョン・ランゲージモデル向け
diffusion/ — FLUX / Wan / Qwen-Image の LoRA 微調整
- モデルの差し替え: 1 つのフィールドをオーバーライドする
automodel recipe.yaml --model.pretrained_model_name_or_path
- スケーリング: 同じレシピで 8 GPU で実行可能(
--nproc-per-node 8)。
または、同梱された slurm.sub / SkyPilot / Kubernetes ランチャーを使ってマルチノード展開も可能です。
- ドキュメント: https://docs.nvidia.com/nemo/automodel/latest/index.html
""")
NeMoAutoModelForCausalLM を通じてモデルを読み込み、追加の生成例を実行することで、Python インターフェースの直接使用をデモンストレーションします。バージョンやハードウェアに依存するエラーが発生しても柔軟に対応し、ノートブックが正常に完了できるよう設計しています。最後に、利用可能なレシピのカテゴリ、モデル上書き構文、分散スケーリングオプション、および公式ドキュメントへのアクセス経路について解説します。
結論として、環境検証からソースコードのインストール、レシピの確認、設定パッチ適用、LoRA によるトレーニング、チェックポイントの復元、モデル評価、そして Python API を介した直接推論までを網羅する、実用的な NeMo AutoModel パイプラインを構築しました。NeMo AutoModel では、モデル、データセット、オプティマイザ、精度設定、並列処理、チェックポイント動作などを再利用可能な YAML レシピで指定することで、分散トレーニング戦略とアプリケーションコードを明確に分離しています。
今回は単一の Colab GPU 上でワークフローを実行しましたが、大規模な FSDP2、テンソル並列、コンテキスト並列、シーケンス並列、パイプライン並列の各展開でも採用されている SPMD(Single Program Multiple Data)指向の構造をそのまま維持しています。これにより、言語モデルやビジョン・ランゲージモデル、事前学習、拡散モデルなど他のレシピへの適応や、実験段階からマルチノードの NVIDIA インフラへスケールする際にも、技術的に根拠のある出発点を提供します。
詳細なコードは、こちらからご確認ください。また、Twitter でフォローしていただくと幸いです。15 万人以上の ML エンジニアが集まる Reddit サブコミュニティにもぜひご参加ください。さらに、ニュースレターへの購読も忘れずに。
あ、Telegram も利用されていますか?今なら Telegram でも私たちに参加いただけます。
本記事「Fine-Tuning Qwen3 with LoRA Using NVIDIA NeMo AutoModel: A Complete Single-GPU Google Colab Workflow Tutorial」は、MarkTechPost で公開されたものです。
AI算出
技術分析ainew評価標準
記事は特定のモデル(Qwen3)とツール(NeMo AutoModel, Colab)を用いた実装ワークフローを提供しており、AI/ML の核心テーマであるファインチューニングに直接関連する。新規性については、既存のツールやモデルを組み合わせる独自の実装知見(Colab 制約への対応など)が含まれるが、世界初の発表ではないため中程度の評価とした。検索機会においては「Qwen3」という明確なモデル名と「NeMo」がタイトルに含まれているため高い値とし、日本関連性は海外ツール・モデルの一般利用事例であるため低めとした。
6つの評価軸を見る
- AI関連度
- 100
- 情報源の信頼性
- 25
- 新規性
- 50
- 調べる価値
- 100
- 重複の少なさ
- 100
- 日本での有用性
- 25
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み