Amazon Bedrockでは、自社データで基盤モデルをカスタマイズでき、モデルをゼロから構築せずにドメイン固有タスクの性能を向上できます。
カスタマイズ方法
| 方法 |
目的 |
必要なデータ |
| 継続事前学習 |
ドメイン言語への適応 |
ラベルなしテキスト |
| ファインチューニング |
タスク性能の向上 |
ラベル付き例 |
flowchart LR
A["ベースモデル"] --> B["継続事前学習"]
B --> C["ドメイン適応モデル"]
C --> D["ファインチューニング"]
D --> E["タスク最適化モデル"]
style B fill:#3b82f6,color:#fff
style D fill:#8b5cf6,color:#fff
サポートされるモデル
| モデル |
ファインチューニング |
継続事前学習 |
| Amazon Titan Text |
可能 |
可能 |
| Cohere Command |
可能 |
不可 |
| Meta Llama 2/3 |
可能 |
不可 |
データ準備
ファインチューニング形式(JSONL)
{"prompt": "このドキュメントを要約してください:", "completion": "このドキュメントは...について述べています"}
{"prompt": "フランス語に翻訳:", "completion": "Bonjour, comment allez-vous?"}
{"prompt": "感情を分類:", "completion": "ポジティブ"}
継続事前学習形式
{"input": "ドメイン固有のテキストコンテンツ。これはモデルがドメイン用語とパターンを学習するのに役立ちます。"}
{"input": "ドメイン知識を含む別のドキュメント..."}
データ要件
| 観点 |
ファインチューニング |
継続事前学習 |
| 最小サンプル数 |
1000以上 |
100,000トークン以上 |
| 形式 |
プロンプト-補完ペア |
生テキスト |
| 品質 |
クリーン、多様 |
代表的 |
ファインチューニングジョブの作成
S3データの準備
import boto3
import json
s3 = boto3.client('s3')
training_data = [
{"prompt": "お客様: 製品が壊れています\nエージェント:", "completion": "申し訳ございません。交換の手配をいたします。"},
{"prompt": "お客様: 注文はいつ届きますか?\nエージェント:", "completion": "注文状況を確認いたします。注文番号を教えていただけますか?"},
]
with open('/tmp/training.jsonl', 'w') as f:
for item in training_data:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
s3.upload_file('/tmp/training.jsonl', 'my-bucket', 'training/train.jsonl')
カスタマイズジョブの作成
client = boto3.client('bedrock')
response = client.create_model_customization_job(
jobName='customer-service-ft',
customModelName='customer-service-titan',
roleArn='arn:aws:iam::123456789012:role/BedrockCustomizationRole',
baseModelIdentifier='amazon.titan-text-express-v1',
customizationType='FINE_TUNING',
trainingDataConfig={
's3Uri': 's3://my-bucket/training/train.jsonl'
},
validationDataConfig={
's3Uri': 's3://my-bucket/training/validation.jsonl'
},
outputDataConfig={
's3Uri': 's3://my-bucket/output/'
},
hyperParameters={
'epochCount': '3',
'batchSize': '8',
'learningRate': '0.00001'
}
)
job_arn = response['jobArn']
ジョブステータスの監視
response = client.get_model_customization_job(jobIdentifier=job_arn)
print(f"ステータス: {response['status']}")
print(f"トレーニングメトリクス: {response.get('trainingMetrics', {})}")
ハイパーパラメータ
| パラメータ |
説明 |
一般的な範囲 |
| epochCount |
トレーニングパス数 |
1-5 |
| batchSize |
バッチあたりのサンプル数 |
4-32 |
| learningRate |
更新ステップサイズ |
1e-6 to 1e-4 |
| learningRateWarmupSteps |
ウォームアップ期間 |
0-100 |
カスタムモデルの使用
Provisioned Throughputの作成
カスタムモデルにはProvisioned Throughputが必要です:
response = client.create_provisioned_model_throughput(
modelUnits=1,
provisionedModelName='customer-service-pt',
modelId='arn:aws:bedrock:us-east-1:123456789012:custom-model/customer-service-titan'
)
provisioned_arn = response['provisionedModelArn']
カスタムモデルの呼び出し
runtime = boto3.client('bedrock-runtime')
response = runtime.invoke_model(
modelId=provisioned_arn,
body=json.dumps({
"inputText": "お客様: 荷物が破損しています\nエージェント:",
"textGenerationConfig": {
"maxTokenCount": 256,
"temperature": 0.7
}
})
)
result = json.loads(response['body'].read())
print(result['results'][0]['outputText'])
評価
組み込みメトリクス
| メトリクス |
説明 |
| Training Loss |
トレーニングデータへのモデル適合度 |
| Validation Loss |
汎化能力 |
| Perplexity |
予測の確信度 |
カスタム評価
def evaluate_model(model_id, test_data):
runtime = boto3.client('bedrock-runtime')
results = []
for item in test_data:
response = runtime.invoke_model(
modelId=model_id,
body=json.dumps({
"inputText": item['prompt'],
"textGenerationConfig": {"maxTokenCount": 256}
})
)
output = json.loads(response['body'].read())
predicted = output['results'][0]['outputText']
results.append({
'expected': item['completion'],
'predicted': predicted,
'match': item['completion'].lower() in predicted.lower()
})
accuracy = sum(1 for r in results if r['match']) / len(results)
return accuracy, results
ベストプラクティス
| プラクティス |
推奨事項 |
| データ品質 |
クリーン、多様、代表的 |
| 小さく始める |
まずサブセットでテスト |
| ロスを監視 |
過学習に注意 |
| 検証 |
ホールドアウトテストセットを使用 |
| バージョン管理 |
データとモデルのバージョンを追跡 |
コスト考慮事項
| コンポーネント |
課金要素 |
| トレーニング |
処理トークン単位 |
| ストレージ |
カスタムモデル保存 |
| 推論 |
Provisioned Throughput |
重要なポイント
- 2つのカスタマイズタイプ - ドメイン用の事前学習、タスク用のファインチューニング
- データ品質が重要 - クリーンで多様な例が結果を改善
- Provisioned Throughputが必要 - カスタムモデル推論に
- トレーニングメトリクスを監視 - 過学習を防止
- ベースラインから開始 - ベースモデルと比較
参考文献