モデル蒸留を活用して、大規模な教師モデルから知識を小規模な学生モデルへ転送し、性能を維持します。
モデル蒸留は、大規模言語モデル(LLM)のサイズおよび計算リソース要件を削減しつつ、性能を維持します。本ガイドでは、Qwen2 モデルを用いたデータ拡張および蒸留について説明します。
ワークフロー
-
指定されたフォーマットおよび戦略に従って、訓練データセットを準備します。
-
Qwen2-1.5B-Instruct-Exp または Qwen2-7B-Instruct-Exp を使用して、意味的に類似した命令を生成します。拡張により、蒸留時の汎化性能が向上します。
-
Qwen2-1.5B-Instruct-Refine または Qwen2-7B-Instruct-Refine を使用して、拡張済みを含む命令を充実させ、テキスト生成品質を向上させます。
-
Qwen2-72B-Instruct を使用して、訓練データセット内の命令に対する応答を生成し、教師モデルの知識を転送します。
-
完成した命令・応答データセットを用いて、本番環境向けに最適化された小規模な学生モデルをトレーニングします。
前提条件
以下の前提条件を完了してください:
-
Deep Learning Containers(DLC)および PAI の EAS を従量課金で有効化し、デフォルトのワークスペースを作成します。詳細については、「PAI の有効化とデフォルトワークスペースの作成」をご参照ください。
-
訓練データおよびモデルファイルを格納する OSS バケットを作成します。詳細については、「クイックスタート」をご参照ください。
命令データの準備
「データ準備戦略」および「データ形式の要件」に従って、命令データを準備します:
データ準備戦略
モデル蒸留の効果および安定性を高めるため、以下の戦略でデータを準備します:
-
最低でも数百件のデータポイントを準備します。データ量が多いほど、モデルの性能が向上します。
-
多様でバランスの取れた分布を確保します。具体的には、多様なタスクシナリオ、入力および出力の長さ(短いものと長いもの)のバリエーション、および多言語データセットにおける言語分布のバランスをとります。
-
異常なデータを処理します。わずかな量であっても、ファインチューニング結果に影響を与える可能性があります。ルールベースの手法を用いて、無効なエントリをクリーニングおよびフィルタリングします。
データ形式の要件
訓練データセットは、instruction という単一のフィールドを持つ JSON ファイルである必要があります。このフィールドには入力命令が含まれます。例:
[
{
"instruction": "2008 年の金融危機において、各国政府が金融市場の安定化のために講じた主な措置は何ですか?"
},
{
"instruction": "気候変動の悪化に伴い、各国政府が持続可能な開発を推進するために講じた重要な施策は何ですか?"
},
{
"instruction": "2001 年のテクノロジーバブル崩壊時に、各国政府が経済回復を支援するために講じた主な措置は何ですか?"
}
]
オプション:命令の拡張
命令拡張は、ユーザー提供の命令データセットを拡張し、多様性およびカバー率を高める手法です。
-
たとえば、次のような入力が与えられた場合:
魚香味の豚肉細切りを調理する方法を教えてください。 GRE 試験の準備方法を教えてください。 友人に誤解された場合、どうすればよいですか? -
モデルは次のような出力を生成します:
麻婆豆腐の作り方を教えてください。 TOEFL 試験の準備に関する詳細なガイドを提供してください。 職場で挫折に直面した際、どのようにマインドセットを調整すればよいですか?
命令の多様性は、大規模言語モデルの汎化性能に影響を与えます。命令の拡張により、学生モデルの性能が向上します。PAI では、Qwen2 を基盤とする 2 つの独自の命令拡張モデル(Qwen2-1.5B-Instruct-Exp および Qwen2-7B-Instruct-Exp)を提供しています。いずれかを EAS オンラインサービスとしてデプロイできます:
モデルサービスのデプロイ
命令拡張モデルを EAS オンラインサービスとしてデプロイします。
-
モデルギャラリーページに移動します。
-
PAI コンソール にログインします。
-
左上隅で、ご利用のリージョンを選択します。
-
左側のナビゲーションウィンドウで、ワークスペース を選択し、ご利用のワークスペース名をクリックします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
-
モデルギャラリー ページで、Qwen2-1.5B-Instruct-Exp または Qwen2-7B-Instruct-Exp を検索し、[デプロイ] をクリックします。
-
デプロイ パネルで、モデルサービス情報 および リソースデプロイ情報 のデフォルト値を確認します。必要に応じて変更し、デプロイ をクリックします。
-
課金通知 ダイアログで、OK をクリックします。
システムが デプロイタスク ページを開きます。ステータス が 実行中 と表示された場合、デプロイは成功です。
モデルサービスの呼び出し
デプロイ後、API を使用して推論を実行します。「大規模言語モデルのデプロイ」をご参照ください。クライアント側のリクエスト例を以下に示します:
-
サービスのエンドポイントおよびトークンを取得します。
-
サービスの詳細 ページで、基本情報 をクリックし、エンドポイント情報の表示 をクリックします。

-
エンドポイント情報 ダイアログで、エンドポイントおよびトークンを確認し、ローカルに保存します。
-
-
以下の Python スクリプトを作成して実行します:
import argparse import json import requests from typing import List def post_http_request(prompt: str, system_prompt: str, host: str, authorization: str, max_new_tokens: int, temperature: float, top_k: int, top_p: float) -> requests.Response: headers = { "User-Agent": "Test Client", "Authorization": f"{authorization}" } pload = { "prompt": prompt, "system_prompt": system_prompt, "top_k": top_k, "top_p": top_p, "temperature": temperature, "max_new_tokens": max_new_tokens, "do_sample": True, "eos_token_id": 151645 } response = requests.post(host, headers=headers, json=pload) return response def get_response(response: requests.Response) -> List[str]: data = json.loads(response.content) output = data["response"] return output if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--top-k", type=int, default=50) parser.add_argument("--top-p", type=float, default=0.95) parser.add_argument("--max-new-tokens", type=int, default=2048) parser.add_argument("--temperature", type=float, default=1) parser.add_argument("--prompt", type=str, default="私に歌を歌ってください。") args = parser.parse_args() prompt = args.prompt top_k = args.top_k top_p = args.top_p temperature = args.temperature max_new_tokens = args.max_new_tokens host = "EAS HOST" authorization = "EAS TOKEN" print(f" --- 入力: {prompt}\n", flush=True) system_prompt = "あなたは命令作成者です。目的は、[与えられた命令] をヒントに新しい命令を作成することです。" response = post_http_request( prompt, system_prompt, host, authorization, max_new_tokens, temperature, top_k, top_p) output = get_response(response) print(f" --- 出力: {output}\n", flush=True)パラメーター:
-
host:サービスのエンドポイント。
-
authorization:サービスのトークン。
-
バッチ処理による拡張
EAS サービスを使用して、命令をバッチ処理します。この例では、カスタム JSON データセットを読み込み、モデル API を呼び出して命令を拡張します。以下の Python スクリプトを作成して実行します:
import requests
import json
import random
from tqdm import tqdm
from typing import List
input_file_path = "input.json" # 入力ファイル名
with open(input_file_path) as fp:
data = json.load(fp)
total_size = 10 # 拡張後の合計サンプル数(目標)
pbar = tqdm(total=total_size)
while len(data) < total_size:
prompt = random.sample(data, 1)[0]["instruction"]
system_prompt = "あなたは命令作成者です。目的は、[与えられた命令] をヒントに新しい命令を作成することです。"
top_k = 50
top_p = 0.95
temperature = 1
max_new_tokens = 2048
host = "EAS HOST"
authorization = "EAS TOKEN"
response = post_http_request(
prompt, system_prompt,
host, authorization,
max_new_tokens, temperature, top_k, top_p)
output = get_response(response)
temp = {
"instruction": output
}
data.append(temp)
pbar.update(1)
pbar.close()
output_file_path = "output.json" # 出力ファイル名
with open(output_file_path, 'w') as f:
json.dump(data, f, ensure_ascii=False)
パラメーター:
-
host:サービスのエンドポイント。
-
authorization:サービスのトークン。
-
file_path:データセットファイルのローカルパスに置き換えてください。
-
post_http_requestおよびget_response関数は、「モデルサービスの呼び出し」の Python スクリプトで定義されているものと同じです。
あるいは、コードを記述せずに PAI-Designer の LLM-Instruction Expansion(DLC)コンポーネントを使用することも可能です。「カスタムパイプライン」をご参照ください。
オプション:命令の最適化
命令最適化は、ユーザー提供の命令データセットを精緻化し、より詳細で構造化された命令を生成することで、大規模言語モデルの応答を豊かにする手法です。
-
たとえば、命令最適化モデルへの入力として次のような内容が与えられた場合:
魚香味の豚肉細切りを調理する方法を教えてください。 GRE 試験の準備方法を教えてください。 友人に誤解された場合、どうすればよいですか? -
モデルは次のような出力を生成します:
四川風の魚香味豚肉細切りの詳細なレシピを提供してください。野菜、豚肉、調味料を含む具体的な材料リストと、手順ごとの調理方法を記載してください。また、それに合うおすすめの副菜および主食も提案してください。 GRE の登録方法、必要な書類、学習戦略、推奨される復習資料を網羅した包括的なガイドを提供してください。さらに、効果的な練習問題および模擬試験を紹介し、準備をサポートしてください。 友人に誤解された際に冷静かつ合理的に対応し、それを解決するために効果的にコミュニケーションをとるための詳細なガイドを提供してください。実践的なアドバイス(たとえば、自分の考えや感情をどう伝えるか、誤解を悪化させないための方法、練習用の具体的な会話シーンや状況など)を含めてください。
命令の詳細度は、大規模言語モデルの出力品質に影響を与えます。命令の最適化により、学生モデルの性能が向上します。PAI では、Qwen2 を基盤とする 2 つの独自の命令最適化モデル(Qwen2-1.5B-Instruct-Refine および Qwen2-7B-Instruct-Refine)を提供しています。いずれかを EAS オンラインサービスとしてデプロイできます:
モデルサービスのデプロイ
-
モデルギャラリーページに移動します。
-
PAI コンソール にログインします。
-
左上隅で、ご利用のリージョンを選択します。
-
左側のナビゲーションウィンドウで、ワークスペース を選択し、ご利用のワークスペース名をクリックします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
-
モデルギャラリーページで、Qwen2-1.5B-Instruct-Refine または Qwen2-7B-Instruct-Refine を検索し、デプロイ をクリックします。
-
デプロイ パネルで、モデルサービス情報 および リソースデプロイ情報 のデフォルト値を確認します。必要に応じて変更し、デプロイ をクリックします。
-
課金通知 ダイアログで、OK をクリックします。
システムが デプロイタスク ページを開きます。ステータス が 実行中 と表示された場合、デプロイは成功です。
モデルサービスの呼び出し
デプロイ後、API を使用して推論を実行します。「大規模言語モデルのデプロイ」をご参照ください。クライアント側のリクエスト例を以下に示します:
-
サービスのエンドポイントおよびトークンを取得します。
-
サービスの詳細 ページで、基本情報 をクリックし、エンドポイント情報の表示 をクリックします。

-
エンドポイント情報 ダイアログで、エンドポイントおよびトークンを確認し、ローカルに保存します。
-
-
以下の Python スクリプトを作成して実行します:
import argparse import json import requests from typing import List def post_http_request(prompt: str, system_prompt: str, host: str, authorization: str, max_new_tokens: int, temperature: float, top_k: int, top_p: float) -> requests.Response: headers = { "User-Agent": "Test Client", "Authorization": f"{authorization}" } pload = { "prompt": prompt, "system_prompt": system_prompt, "top_k": top_k, "top_p": top_p, "temperature": temperature, "max_new_tokens": max_new_tokens, "do_sample": True, "eos_token_id": 151645 } response = requests.post(host, headers=headers, json=pload) return response def get_response(response: requests.Response) -> List[str]: data = json.loads(response.content) output = data["response"] return output if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--top-k", type=int, default=2) parser.add_argument("--top-p", type=float, default=0.95) parser.add_argument("--max-new-tokens", type=int, default=256) parser.add_argument("--temperature", type=float, default=0.5) parser.add_argument("--prompt", type=str, default="私に歌を歌ってください。") args = parser.parse_args() prompt = args.prompt top_k = args.top_k top_p = args.top_p temperature = args.temperature max_new_tokens = args.max_new_tokens host = "EAS HOST" authorization = "EAS TOKEN" print(f" --- 入力: {prompt}\n", flush=True) system_prompt = "この命令を、より詳細かつ具体的になるように最適化してください。" response = post_http_request( prompt, system_prompt, host, authorization, max_new_tokens, temperature, top_k, top_p) output = get_response(response) print(f" --- 出力: {output}\n", flush=True)パラメーター:
-
host:サービスのエンドポイント。
-
authorization:サービスのトークン。
-
バッチ処理による最適化
EAS サービスを使用して、命令をバッチ処理します。この例では、カスタム JSON データセットを読み込み、モデル API を呼び出して命令を最適化します。以下の Python スクリプトを作成して実行します:
import requests
import json
import random
from tqdm import tqdm
from typing import List
input_file_path = "input.json" # 入力ファイル名
with open(input_file_path) as fp:
data = json.load(fp)
pbar = tqdm(total=len(data))
new_data = []
for d in data:
prompt = d["instruction"]
system_prompt = "次の命令を最適化してください。"
top_k = 50
top_p = 0.95
temperature = 1
max_new_tokens = 2048
host = "EAS HOST"
authorization = "EAS TOKEN"
response = post_http_request(
prompt, system_prompt,
host, authorization,
max_new_tokens, temperature, top_k, top_p)
output = get_response(response)
temp = {
"instruction": output
}
new_data.append(temp)
pbar.update(1)
pbar.close()
output_file_path = "output.json" # 出力ファイル名
with open(output_file_path, 'w') as f:
json.dump(new_data, f, ensure_ascii=False)
パラメーター:
-
host:サービスのエンドポイント。
-
authorization:サービスのトークン。
-
file_path:データセットファイルのローカルパスに置き換えてください。
-
post_http_requestおよびget_response関数は、「モデルサービスの呼び出し」の Python スクリプトで定義されているものと同じです。
あるいは、コードを記述せずに PAI-Designer の LLM-Instruction Optimization(DLC)コンポーネントを使用することも可能です。「カスタムパイプライン」をご参照ください。
教師モデルによる応答の生成
モデルサービスのデプロイ
命令データセットの最適化が完了したら、教師となる大規模言語モデルをデプロイして応答を生成します:
-
モデルギャラリーページに移動します。
-
PAI コンソール にログインします。
-
左上隅で、ご利用のリージョンを選択します。
-
左側のナビゲーションウィンドウで、ワークスペース を選択し、ご利用のワークスペース名をクリックします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
-
モデルギャラリーページで、Qwen2-72B-Instruct を検索し、デプロイ をクリックします。
-
デプロイ パネルで、モデルサービス情報 および リソースデプロイ情報 のデフォルト値を確認します。必要に応じて変更し、デプロイ をクリックします。
-
課金通知 ダイアログで、OK をクリックします。
システムが デプロイタスク ページを開きます。ステータス が 実行中 と表示された場合、デプロイは成功です。
モデルサービスの呼び出し
デプロイ後、API を使用して推論を実行します。「大規模言語モデルのデプロイ」をご参照ください。クライアント側のリクエスト例を以下に示します:
-
サービスのエンドポイントおよびトークンを取得します。
-
サービスの詳細 ページで、基本情報 をクリックし、エンドポイント情報の表示 をクリックします。

-
エンドポイント情報 ダイアログで、エンドポイントおよびトークンを確認し、ローカルに保存します。
-
-
以下の Python スクリプトを作成して実行します:
import argparse import json import requests from typing import List def post_http_request(prompt: str, system_prompt: str, host: str, authorization: str, max_new_tokens: int, temperature: float, top_k: int, top_p: float) -> requests.Response: headers = { "User-Agent": "Test Client", "Authorization": f"{authorization}" } pload = { "prompt": prompt, "system_prompt": system_prompt, "top_k": top_k, "top_p": top_p, "temperature": temperature, "max_new_tokens": max_new_tokens, "do_sample": True, } response = requests.post(host, headers=headers, json=pload) return response def get_response(response: requests.Response) -> List[str]: data = json.loads(response.content) output = data["response"] return output if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--top-k", type=int, default=50) parser.add_argument("--top-p", type=float, default=0.95) parser.add_argument("--max-new-tokens", type=int, default=2048) parser.add_argument("--temperature", type=float, default=0.5) parser.add_argument("--prompt", type=str) parser.add_argument("--system_prompt", type=str) args = parser.parse_args() prompt = args.prompt system_prompt = args.system_prompt top_k = args.top_k top_p = args.top_p temperature = args.temperature max_new_tokens = args.max_new_tokens host = "EAS HOST" authorization = "EAS TOKEN" print(f" --- 入力: {prompt}\n", flush=True) response = post_http_request( prompt, system_prompt, host, authorization, max_new_tokens, temperature, top_k, top_p) output = get_response(response) print(f" --- 出力: {output}\n", flush=True)パラメーター:
-
host:サービスのエンドポイント。
-
authorization:サービスのトークン。
-
教師モデルによる命令アノテーション(バッチ処理)
この例では、カスタム JSON データセットを読み込み、モデル API を呼び出して命令にアノテーションを付与します。以下の Python スクリプトを作成して実行します:
import json
from tqdm import tqdm
import requests
from typing import List
input_file_path = "input.json" # 入力ファイル名
with open(input_file_path) as fp:
data = json.load(fp)
pbar = tqdm(total=len(data))
new_data = []
for d in data:
system_prompt = "あなたは親切なアシスタントです。"
prompt = d["instruction"]
print(prompt)
top_k = 50
top_p = 0.95
temperature = 0.5
max_new_tokens = 2048
host = "EAS HOST"
authorization = "EAS TOKEN"
response = post_http_request(
prompt, system_prompt,
host, authorization,
max_new_tokens, temperature, top_k, top_p)
output = get_response(response)
temp = {
"instruction": prompt,
"output": output
}
new_data.append(temp)
pbar.update(1)
pbar.close()
output_file_path = "output.json" # 出力ファイル名
with open(output_file_path, 'w') as f:
json.dump(new_data, f, ensure_ascii=False)
パラメーター:
-
host:サービスのエンドポイント。
-
authorization:サービスのトークン。
-
file_path:データセットファイルのローカルパスに置き換えてください。
-
post_http_requestおよびget_response関数は、「モデルサービスの呼び出し」のスクリプトで定義されているものと同じです。
学生モデルのトレーニング
モデルのトレーニング
教師モデルによる応答の取得が完了したら、モデルギャラリーで学生モデルをトレーニングします。本ソリューションでは Qwen2-7B-Instruct を使用します:
-
モデルギャラリーページに移動します。
-
PAI コンソール にログインします。
-
左上隅で、ご利用のリージョンを選択します。
-
左側のナビゲーションウィンドウで、ワークスペース を選択し、ご利用のワークスペース名をクリックします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
-
モデルギャラリーページで、Qwen2-7B-Instruct カードを検索してクリックし、詳細ページを開きます。
-
モデル詳細ページで、右上隅の ファインチューニング をクリックします。
-
ファインチューニング パネルで、以下の主要パラメーターを設定します。その他のパラメーターはデフォルト値のままとします。
パラメーター
説明
デフォルト値
データセット構成
訓練データセット
ドロップダウンから OSS ファイルまたはディレクトリ を選択し、データセットの OSS パスを選択します:
-
をクリックし、ご利用の OSS バケットを選択します。 -
ファイルのアップロード をクリックし、データセットファイルを OSS ディレクトリにアップロードします。
-
OK をクリックします。
なし
トレーニング出力構成
model
をクリックし、OSS ストレージディレクトリを選択します。なし
tensorboard
をクリックし、OSS ストレージディレクトリを選択します。なし
コンピューティングリソース構成
ジョブリソース
リソース仕様を選択します。システムが適切なオプションを推奨します。
なし
ハイパーパラメーター構成
learning_rate
学習率。型:Float。
5e-5
num_train_epochs
トレーニングエポック数。型:INT。
1
per_device_train_batch_size
GPU あたりの反復ごとの訓練サンプル数。型:INT。
1
seq_length
テキストシーケンス長。型:INT。
128
lora_dim
LoRA ディメンション。型:INT。lora_dim > 0 の場合、LoRA/QLoRA 軽量トレーニングを使用します。
32
lora_alpha
LoRA 重み。型:INT。lora_dim > 0 かつ LoRA/QLoRA 軽量トレーニングが使用される場合にのみ有効です。
32
load_in_4bit
モデルを 4 ビットモードでロードするかどうか。型:bool。有効な値:
-
true
-
false
lora_dim > 0、load_in_4bit が true、load_in_8bit が false の場合、4 ビット QLoRA 軽量トレーニングを使用します。
true
load_in_8bit
モデルを 8 ビットモードでロードするかどうか。型:bool。有効な値:
-
true
-
false
lora_dim > 0、load_in_4bit が false、load_in_8bit が true の場合、8 ビット QLoRA 軽量トレーニングを使用します。
false
gradient_accumulation_steps
勾配累積ステップ数。型:INT。
8
apply_chat_template
訓練データをデフォルトのチャットテンプレートと結合するかどうか。型:bool。有効な値:
-
true
-
false
Qwen2 シリーズモデルの場合、フォーマットは以下のとおりです:
-
質問:
<|im_end|>\n<|im_start|>user\n + instruction + <|im_end|>\n -
回答:
<|im_start|>assistant\n + output + <|im_end|>\n
true
system_prompt
トレーニング用のシステムプロンプト。型:String。
あなたは親切なアシスタントです
-
-
パラメーターを設定した後、[学習] をクリックします。
-
課金通知 ダイアログで、OK をクリックします。
システムがトレーニングタスクページを開きます。
モデルサービスのデプロイ
トレーニング後、モデルを EAS サービスとしてデプロイします。
-
トレーニングタスクページで、右側の デプロイ をクリックします。
-
デプロイパネルで、モデルサービス情報 および リソースデプロイ情報 のデフォルト値がシステムにより設定されます。必要に応じて変更し、デプロイ をクリックします。
-
課金通知 ダイアログで、OK をクリックします。
システムが デプロイタスク ページを開きます。ステータス が 実行中 と表示された場合、デプロイは成功です。
モデルサービスの呼び出し
デプロイ後、API を使用して推論を実行します。「大規模言語モデルのデプロイ」をご参照ください。
参考資料
-
「EAS の概要」をご参照ください。
-
PAI-モデルギャラリーでは、Llama-3、Qwen1.5、Stable Diffusion V1.5 など、多数のシナリオに対応したモデルのデプロイおよびファインチューニングが可能です。「シナリオ別実践ガイド」をご参照ください。