新卒エンジニアが挑戦!NVIDIA A100でLLMのファインチューニングを実行してみた

2025年6月27日掲載

キービジュアル

2024年に新卒入社した井手です。

本記事では、HPC(High Performance Computing)システムの使用経験がなかった私が、ソフトバンクが提供する高性能GPU「NVIDIA A100 GPU」と、NVIDIAのソフトウェアプラットフォーム「NVIDIA® NGC™」を活用して、大規模言語モデル(Large Language Model:LLM)をキャラクター口調で応答するようにファインチューニングした事例を紹介します。

HPCやGPUを使ったLLMのファインチューニングに初めて取り組む方や、NVIDIA NGCを用いた開発に関心のある方にとって参考になれば嬉しいです。

目次

1 NVIDIA A100について

NVIDIA A100は、NVIDIAが提供するAmpereアーキテクチャを採用した高性能GPUで、主にAIの学習や科学技術計算など、大規模な計算処理を必要とする分野で活用されています。

コンシューマ向けGPUと比較して、A100は大容量のGPUメモリを備えており、40GBモデルと80GBモデルの2種類が提供されています。

今回はソフトバンクが提供する「DGX A100」クラスタのうち、80GBのA100を8基搭載した1ノードを使用して学習を行います。

A100についての詳細は以下の関連記事をぜひご参照ください。

2 今回の実行環境について

今回の実行環境について簡単に説明します。

今回使用するHPCシステムは複数の計算ノードをネットワークで接続したクラスター構成となっています。

まずユーザーは、「ログインサーバー」と呼ばれるHPCシステムの入口にアクセスし、そこから、「ジョブスケジューラ(Job Scheduler)」を通じて「学習プログラム(training job)」を投入します。これにより、A100 GPUを搭載した計算ノード上でジョブを実行することが可能になります。

ログインサーバーおよびA100搭載ノードの双方に共通のストレージがマウントされているため、必要なファイルやプログラムはあらかじめストレージ内に格納しておくことで、学習時にこれらのデータを使用できます。

<参考>今回の実行環境

3 ジョブスケジューラについて

今回の環境では、契約しているGPUリソースを効率的に利用するために、Slurmというオープンソースのジョブ管理システムを用いてジョブの実行を管理しています。

3.1 ジョブスケジューラの仕組み

ジョブスケジューラの仕組みについて簡単に説明します。

今回私はDGX A100を1ノード使用するため、1つのジョブに対してGPUが最大8枚使用できます。

そのため、最初にGPUを4枚使用するジョブを実行すると契約リソースの状況は図のようになります。

次に、GPUを5枚使用するジョブを実行すると、空きリソースが4個しかないためジョブ待ち(PENDING)が発生します。

ジョブが終了し、空きリソースが増えると自動でキューにあるジョブが実行されます。

このようにリソースの中で効率的にジョブを割り当てる仕組みがジョブスケジューラです。

3.2 ジョブの実行方法について

次は実際にどのようにジョブを実行するかについて説明します。

今回はsbatchコマンド(slurm sbatch)を用いて、バッチジョブを実行する方法について解説します。

実行方法は簡単で、実行内容を記載したバッチスクリプト(batch script)を作成して、ログインサーバーからsbatchコマンドでスクリプトを投入するだけで実行できます。

このように、使用するGPUの枚数を指定してスクリプト内にコマンドを記述することで、GPUを使用した学習が実行できます。

4 NVIDIA NGCについて

NVIDIA NGCとは、NVIDIAが提供しているDeep Learningおよび科学計算用に最適化されたGPU活用クラウドプラットフォームです。

NGC内のNGC Catalogでは、生成AI、創薬、音声合成など、さまざまな分野に対応したソフトウェアがコンテナ形式でパッケージ化されて提供されています。

主要なフレームワークやモデル、ツールが一通り揃っており、環境構築の手間を大幅に軽減できます。

5 今回の実装内容、流れ

今回は、日本語に特化した対話形式の大規模言語モデルに対して、語尾が特徴的なキャラクター「ずんだもん」の口調で対話するデータセットを学習させ、キャラクター口調で話すLLMモデルを作成します。

本記事では、学習に必要な要素を準備する”準備フェーズ”とそれらを使って実際に学習・推論を行う”実行フェーズ”に分けて説明します。

6 準備フェーズ

6.1 データセットの準備

データセットは、学習前と学習後の変化がわかりやすいように、語尾が「〜なのだ。」という特徴的な話し方をするキャラクター「ずんだもん」のオープン対話セットを使用します。

使用データセット:”takaaki-inada/databricks-dolly-15k-ja-zundamon” CC BY SA 3.0

https://huggingface.co/datasets/takaaki-inada/databricks-dolly-15k-ja-zundamon

このデータセットには15,015件の対話データが含まれており、以下のように学習用と評価用に分割して使用します。

・学習データ(90%):モデルに学習させるデータセット

・評価データ(10%):学習後のモデルの性能を評価するデータセット

6.2 LLMモデルの準備

モデルは、SB Intuitionsが開発した日本語特化型の対話形式に最適化された大規模言語モデルである、sarashina2.2-3b-instruct-v0.1を使用します。

・使用モデル:sbintuitions/sarashina2.2-3b-instruct-v0.1

https://huggingface.co/sbintuitions/sarashina2.2-3b-instruct-v0.1

 

6.3 コンテナの準備

コンテナはNGC Catalogで提供されている、生成AI向けのフレームワークコンテナである
「NeMo Framework」を使用します。

「NeMo Framework」は、LLMを始めとした生成AIモデルを構築、カスタマイズするためのフレームワークであり、NGC上にあらかじめコンテナ形式で提供されています。

コンテナ内には、トレーニングスクリプトや必要な依存ライブラリが含まれており、開発初心者でもすぐに生成AIの開発に取り組める設計になっています。

なお、今回の実行環境では、dockerコマンドの代わりにEnroot/Pyxisというソフトウェアを用いてコンテナを実行します。

6.3.1 NGCとA100環境の接続設定

A100環境にてNGCのコンテナを使用するための接続設定をおこないます。
※今回はNGCのアカウントを所持していることが前提で解説をおこないます。

まずは、NGC Catalogにアクセスし、アカウントにサインインをおこないます。

その後、アカウントをクリックし、Setupボタン>Keys/Secrets>Generate API Keyボタンをクリックします。

するとGenerate Personal Keyというボタンが出てくるのでクリックし、Keyの名前、有効期限、使用するサービス(今回はNGC Catalog)を選択してPersonal Keyを作成します。

作成したAPI Keyは一度しか画面に表示されないので、メモを取って保管してください。

次に、ログインサーバーでNGCとログインサーバーの接続作業を行います。

ログインサーバーに認証情報のファイルである.credentialsファイルを任意の場所に作成します。

これで、NGCとログインサーバーの接続準備が完了します。

6.3.2 コンテナのダウンロード

接続準備が完了したので、コンテナをダウンロードします。

NGC CatalogにてNeMo Frameworkを検索し、コンテナイメージのパスを取得しておきます。

次からはログインサーバー上での作業になります。

まずはNGCとの設定ファイルにパスが通るように環境変数を指定します。

環境変数指定後、enroot importコマンドを使用することでコンテナがsqshファイルとしてダウンロードできます。

これで、コンテナの準備は完了です。

7 Fine-tuningの実行

必要な準備が整ったので、いよいよNemo Frameworkを用いたfine-tuningを行います。

NVIDIA NeMo™による学習は以下の流れで行われます。

今回はNVIDIA 技術ブログ「NeMo Framework で日本語 LLM をファインチューニング – SFT 編 –」を参考にしてSFTで学習を進めました。

<参考> NVIDIA 技術ブログ「NeMo Framework で日本語 LLM をファインチューニング – SFT 編 –」

7.1 nemoフォーマットへ変換

SarashinaはLlamaベースのモデルのため、NeMo Framework内の変換スクリプトであるconvert_llama_hf_to_nemo.pyを使用しnemoフォーマットに変換します。

7.2 学習を実行

学習は、NeMo Framework内の学習スクリプトであるtrain_gpt_sft.pyを用いて実行します。

このスクリプトでは、学習に使用するデータパス、出力ディレクトリ、エポック数(学習回数)などの主要なパラメータをコマンドライン引数で指定します。

それ以外のパラメータについては、既定の設定ファイルである
/opt/NeMo-Aligner/examples/nlp/gpt/conf/gpt_sft.yamlの設定が反映されます。

今回はNVIDIA 技術ブログで紹介されている学習の設定を参考にしつつ、以下の点をカスタマイズして学習を実行しました。

  • Weights and Biasesを使用しない
  • 学習回数を5回に変更

学習完了後、指定したディレクトリにnemoモデルが保管されます。

7.3 nemoフォーマットから変換

最後に、NeMo Framework内のconvert_llama_nemo_to_hf.pyを使用し元のフォーマットに変換します。

8 Fine-tuning結果

ファインチューニングしたモデルを使用して推論を実行した結果が以下になります。

語尾が「〜なのだ。」に変化していることが確認でき、キャラクター「ずんだもん」の口調がモデルに反映されていることが分かりました。

9. まとめ

今回は、A100とNGCを用いたLLMのfine-tuning方法について紹介しました。

今回使用したソフトバンクの環境のDGX A100では、標準ツールとしてSlurmやNGC Catalogが使用できるため、HPCを使用したことがなかった私でも簡単にキャラクター口調のLLMの開発を行うことができました。

 

ソフトバンクは、国内最大級のAI計算基盤の構築を目指しGPUインフラの大規模な拡充を進めています。

その一環として、GPUの性能と信頼性を最大限に引き出すGPUクラスタ「NVIDIA DGX SuperPOD」を提供しており、高性能なGPUクラスタを専有、短期間、1ノードからご利用いただけます。

AIや生成AIの開発、LLMの学習、研究用途まで、パワフルなGPU計算資源をお探しの方は、
以下のフォームよりお気軽にご相談・お問い合わせください。

GPUに関するお問い合わせ

導入を検討のお客様は、ぜひ問い合わせフォームよりお問い合わせください。

おすすめの記事

条件に該当するページがございません