

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 用于微调的基础模型和超参数
<a name="jumpstart-foundation-models-fine-tuning"></a>

基础模型的计算成本很高，并且是在大型的、未标注的语料库上训练的。微调预训练的基础模型是一种经济实惠的方式，可以利用其广泛的功能，同时根据自己的小型语料库来自定义模型。微调是一种自定义方法，它涉及进一步的训练，并且会改变模型的权重。

如果您有以下要求，微调可能会很有用：
+ 根据特定业务需求自定义模型
+ 让模型可以成功处理特定于领域的语言，例如行业术语、技术术语或其他专业词汇
+ 针对特定任务增强性能
+ 在应用中提供准确、相对的和感知上下文的响应
+ 更真实、毒性更小、更符合具体要求的响应

根据使用案例和所选的基础模型，您可以采用两种主要方法进行微调。

1. 如果您有兴趣根据特定于领域数据微调模型，请参阅[利用领域适应性微调大型语言模型（LLM）](jumpstart-foundation-models-fine-tuning-domain-adaptation.md)。

1. 如果您对使用提示和响应样本进行基于指令的微调感兴趣，请参阅[使用提示指令微调大型语言模型（LLM）](jumpstart-foundation-models-fine-tuning-instruction-based.md)。

## 可进行微调的基础模型
<a name="jumpstart-foundation-models-fine-tuning-models"></a>

您可以微调以下任何 JumpStart 基础模型：
+ Bloom 3B
+ Bloom 7B1
+ BloomZ 3B FP16
+ BloomZ 7B1 FP16
+ Code Llama 13B
+ Code Llama 13B Python
+ Code Llama 34B
+ Code Llama 34B Python
+ Code Llama 70B
+ Code Llama 70B Python
+ Code Llama 7B
+ Code Llama 7B Python
+ CyberAgentLM2-7B-Chat (-7B-Chat) CALM2
+ Falcon 40B BF16
+ Falcon 40B Instruct BF16
+ Falcon 7B BF16
+ Falcon 7B Instruct BF16
+ Flan-T5 Base
+ Flan-T5 Large
+ Flan-T5 Small
+ Flan-T5 XL
+ Flan-T5 XXL
+ Gemma 2B
+ Gemma 2B Instruct
+ Gemma 7B
+ Gemma 7B Instruct
+ GPT-2 XL
+ GPT-J 6B
+ GPT-Neo 1.3B
+ GPT-Neo 125M
+ GPT-NEO 2.7B
+ LightGPT Instruct 6B
+ Llama 2 13B
+ Llama 2 13B Chat
+ Llama 2 13B Neuron
+ Llama 2 70B
+ Llama 2 70B Chat
+ Llama 2 7B
+ Llama 2 7B Chat
+ Llama 2 7B Neuron
+ Mistral 7B
+ Mixtral 8x7B
+ Mixtral 8x7B Instruct
+ RedPajama Incite Base 3B V1
+ RedPajama Incite Base 7B V1
+ RedPajama INCITE Chat 3B V1
+ RedPajama INCITE Chat 7B V1
+ RedPajama INCITE Instruct 3B V1
+ RedPajama INCITE Instruct 7B V1
+ Stable Diffusion 2.1

## 通常支持的微调超参数
<a name="jumpstart-foundation-models-fine-tuning-hyperparameters"></a>

微调时，不同的基础模型支持不同的超参数。以下是常用的超参数，可在训练过程中进一步自定义模型：


| 推理参数 | 说明 | 
| --- | --- | 
| `epoch` | 模型在训练过程中通过微调数据集的次数。必须是大于 1 的整数。 | 
| `learning_rate` |  完成每批微调训练样本后，更新模型权重的速度。必须是大于 0 的正浮点数。 | 
| `instruction_tuned` |  是否对模型进行指令训练。必须为 `'True'` 或 `'False'`。 | 
| `per_device_train_batch_size` |  用于训练的每个 GPU 内核或 CPU 的批量大小。其值必须为正整数。 | 
| `per_device_eval_batch_size` |  用于评估的每个 GPU 内核或 CPU 的批量大小。其值必须为正整数。 | 
| `max_train_samples` |  为了调试或加快训练速度，请将训练样本的数量截断为该值。值 -1 表示模型使用了所有训练样本。必须是正整数或 -1。 | 
| `max_val_samples` |  为了调试或加快训练速度，请将验证样本的数量截断为该值。值 -1 表示模型使用了所有验证样本。必须是正整数或 -1。 | 
| `max_input_length` |  令牌化后输入序列的最大总长度。长度超过此值的序列将被截断。如果为 -1，`max_input_length` 将被设置为 1024 和分词器定义的 `model_max_length` 的最小值。如果设置为正值，`max_input_length` 将被设置为所提供值和分词器定义的 `model_max_length` 的最小值。必须是正整数或 -1。 | 
| `validation_split_ratio` |  如果没有验证通道，则训练 - 验证的比例将从训练数据中拆分。必须介于 0 和 1 之间。 | 
| `train_data_split_seed` |  如果不存在验证数据，则将输入的训练数据随机拆分为模型使用的训练数据和验证数据。必须是整数。 | 
| `preprocessing_num_workers` |  用于预处理的进程数。如果 `None`，则使用主进程进行预处理。 | 
| `lora_r` |  低秩适应 (LoRA) r 值，作为权重更新的缩放因子。其值必须为正整数。 | 
| `lora_alpha` |  低秩适应 (LoRA) 阿尔法值，作为权重更新的缩放因子。一般是 `lora_r` 的 2 到 4 倍。其值必须为正整数。 | 
| `lora_dropout` |  低秩适应 (LoRA) 层的释放参数必须是介于 0 和 1 之间的正浮点数。 | 
| `int8_quantization` |  如果 `True`，则模型将以 8 位精度加载，以进行训练。 | 
| `enable_fsdp` |  如果 `True`，则训练使用完全分片数据并行。 | 

在 Studio 中微调模型时，您可以指定超参数值。有关更多信息，请参阅 [在 Studio 中微调模型](jumpstart-foundation-models-use-studio-updated-fine-tune.md)。

使用 SDK 微调模型时，您也可以覆盖默认的超参数值。 SageMaker Python有关更多信息，请参阅 [使用 `JumpStartEstimator` 类微调公开可用的基础模型](jumpstart-foundation-models-use-python-sdk-estimator-class.md)。

# 利用领域适应性微调大型语言模型（LLM）
<a name="jumpstart-foundation-models-fine-tuning-domain-adaptation"></a>

通过领域适应微调，您可以利用预先训练的基础模型，并使用有限的特定于领域的数据，根据特定任务来调整模型。如果通过提示工程无法提供足够的自定义，则可以使用领域适应微调，让您的模型处理特定于领域的语言，例如行业术语、技术术语或其他专业数据。这个微调过程修改模型的权重。

要在特定领域的数据集上微调模型：

1. 准备训练数据。有关说明，请参阅[准备和上传训练数据以进行领域适应微调](#jumpstart-foundation-models-fine-tuning-domain-adaptation-prepare-data)。

1. 创建您的微调训练作业。有关说明，请参阅[创建基于指令的微调的训练作业](#jumpstart-foundation-models-fine-tuning-domain-adaptation-train)。

您可以在中找到 end-to-end示例[示例笔记本](#jumpstart-foundation-models-fine-tuning-domain-adaptation-examples)。

领域适应微调适用于以下基础模型：

**注意**  
一些 JumpStart 基础模型，例如 Llama 2 7B，要求在微调和执行推理之前接受最终用户许可协议。有关更多信息，请参阅 [最终用户许可协议](jumpstart-foundation-models-choose.md#jumpstart-foundation-models-choose-eula)。
+ Bloom 3B
+ Bloom 7B1
+ BloomZ 3B FP16
+ BloomZ 7B1 FP16
+ GPT-2 XL
+ GPT-J 6B
+ GPT-Neo 1.3B
+ GPT-Neo 125M
+ GPT-NEO 2.7B
+ Llama 2 13B
+ Llama 2 13B Chat
+ Llama 2 13B Neuron
+ Llama 2 70B
+ Llama 2 70B Chat
+ Llama 2 7B
+ Llama 2 7B Chat
+ Llama 2 7B Neuron

## 准备和上传训练数据以进行领域适应微调
<a name="jumpstart-foundation-models-fine-tuning-domain-adaptation-prepare-data"></a>

域适应微调的训练数据可以采用 CSV、JSON 或 TXT 文件格式提供。所有训练数据必须放在单个文件夹内的单个文件中。

训练数据取自 CSV 或 JSON 训练数据文件的**文本**列。如果没有标记为**文本**的列，则训练数据将从 CSV 或 JSON 训练数据文件的第一列中获取。

以下是用于微调的 TXT 文件正文示例：

```
This report includes estimates, projections, statements relating to our
business plans, objectives, and expected operating results that are “forward-
looking statements” within the meaning of the Private Securities Litigation
Reform Act of 1995, Section 27A of the Securities Act of 1933, and Section 21E
of ....
```

### 拆分数据用于训练和测试
<a name="jumpstart-foundation-models-fine-tuning-domain-adaptation-split-data"></a>

您可以选择提供另一个包含验证数据的文件夹。此文件夹还应包含一个 CSV、JSON 或 TXT 文件。如果未提供验证数据集，则会留出一定量的训练数据用于验证。在选择用于微调模型的超参数时，可以调整用于验证的训练数据比例。

### 将微调数据上传到 Amazon S3
<a name="jumpstart-foundation-models-fine-tuning-domain-adaptation-upload-data"></a>

将准备好的数据上传到亚马逊简单存储服务 (Amazon S3)，以便在微调 JumpStart 基础模型时使用。您可以使用以下命令上传数据：

```
from sagemaker.s3 import S3Uploader
import sagemaker
import random

output_bucket = sagemaker.Session().default_bucket()
local_data_file = "train.txt"
train_data_location = f"s3://{output_bucket}/training_folder"
S3Uploader.upload(local_data_file, train_data_location)
S3Uploader.upload("template.json", train_data_location)
print(f"Training data: {train_data_location}")
```

## 创建基于指令的微调的训练作业
<a name="jumpstart-foundation-models-fine-tuning-domain-adaptation-train"></a>

将数据上传到 Amazon S3 后，您可以微调和部署 JumpStart 基础模型。要在 Studio 中微调您的模型，请参阅 [在 Studio 中微调模型](jumpstart-foundation-models-use-studio-updated-fine-tune.md)。要使用 SageMaker Python SDK 微调模型，请参阅[使用 `JumpStartEstimator` 类微调公开可用的基础模型](jumpstart-foundation-models-use-python-sdk-estimator-class.md)。

## 示例笔记本
<a name="jumpstart-foundation-models-fine-tuning-domain-adaptation-examples"></a>

有关域适应微调的更多信息，请参阅以下示例笔记本：
+ [SageMaker JumpStart 基础模型——微调特定领域数据集上的文本生成 GPT-J 6B 模型](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/jumpstart-foundation-models/domain-adaption-finetuning-gpt-j-6b.html)
+ [微调 LLa MA 2 机型 JumpStart](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/jumpstart-foundation-models/llama-2-finetuning.html)

# 使用提示指令微调大型语言模型（LLM）
<a name="jumpstart-foundation-models-fine-tuning-instruction-based"></a>

基于指令的微调使用已标注的样本，提高预训练基础模型在特定任务上的性能。已标注样本采用提示和响应对的格式，可解析为指令。这个微调过程修改模型的权重。有关基于指令的微调的更多信息，请参阅 [FLAN 简介：具有指令微调的更具通用性的语言模型](https://ai.googleblog.com/2021/10/introducing-flan-more-generalizable.html)和[缩放指令微调语言模型](https://arxiv.org/abs/2210.11416)。

经过微调的 LAnguage 网络 (FLAN) 模型使用指令调整来使模型更适合解决一般的下游 NLP 任务。Amazon 在 FLAN 模型系列中 SageMaker JumpStart 提供了许多基础模型。例如，FLAN-T5 模型针对广泛的任务进行了指令微调，以提高各种常见使用案例的零样本性能。通过额外的数据和微调，基于指令的模型可以针对在预训练期间未考虑过的更具体的任务进一步进行调整。

要在特定任务中使用提示 - 响应对任务指令对 LLM 进行微调：

1. 在 JSON 文件中编写指令。有关提示 - 响应对文件所需格式和数据文件夹结构的更多信息，请参阅 [准备并上传训练数据，以便进行基于指令的微调](#jumpstart-foundation-models-fine-tuning-instruction-based-prepare-data)。

1. 创建您的微调训练作业。有关说明，请参阅[创建基于指令的微调的训练作业](#jumpstart-foundation-models-fine-tuning-instruction-based-train)。

您可以在中找到 end-to-end示例[示例笔记本](#jumpstart-foundation-models-fine-tuning-instruction-based-examples)。

只有一部分 JumpStart 基础模型与基于指令的微调兼容。基于指令的微调适用于以下基础模型：

**注意**  
一些 JumpStart 基础模型，例如 Llama 2 7B，要求在微调和执行推理之前接受最终用户许可协议。有关更多信息，请参阅 [最终用户许可协议](jumpstart-foundation-models-choose.md#jumpstart-foundation-models-choose-eula)。
+ Flan-T5 Base
+ Flan-T5 Large
+ Flan-T5 Small
+ Flan-T5 XL
+ Flan-T5 XXL
+ Llama 2 13B
+ Llama 2 13B Chat
+ Llama 2 13B Neuron
+ Llama 2 70B
+ Llama 2 70B Chat
+ Llama 2 7B
+ Llama 2 7B Chat
+ Llama 2 7B Neuron
+ Mistral 7B
+ RedPajama Incite Base 3B V1
+ RedPajama Incite Base 7B V1
+ RedPajama INCITE Chat 3B V1
+ RedPajama INCITE Chat 7B V1
+ RedPajama INCITE Instruct 3B V1
+ RedPajama INCITE Instruct 7B V1

## 准备并上传训练数据，以便进行基于指令的微调
<a name="jumpstart-foundation-models-fine-tuning-instruction-based-prepare-data"></a>

基于指令的微调所需的训练数据必须以 JSON 行文本文件格式提供，其中每一行都是一个字典。所有训练数据必须放在一个文件夹中。此文件夹可包含多个 .jsonl 文件。

训练文件夹还可以包含一个模板 JSON 文件 (`template.json`)，用于描述数据的输入和输出格式。如果未提供模板文件，则使用以下模板文件：

```
{
  "prompt": "Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.\n\n### Instruction:\n{instruction}\n\n### Input:\n{context}",
  "completion": "{response}"
}
```

根据 `template.json` 文件，训练数据的每个 .jsonl 条目必须包括 `{instruction}`、`{context}` 和 `{response}` 字段。

如果您提供了自定义模板 JSON 文件，请使用 `"prompt"` 和 `"completion"` 键定义自己的必填字段。根据以下自定义模板 JSON 文件，训练数据的每个 .jsonl 条目必须包括 `{question}`、`{context}` 和 `{answer}` 字段：

```
{
  "prompt": "question: {question} context: {context}",
  "completion": "{answer}"
}
```

### 拆分数据用于训练和测试
<a name="jumpstart-foundation-models-fine-tuning-instruction-based-split-data"></a>

您可以选择提供另一个包含验证数据的文件夹。此文件夹还应包含一个或多个 .jsonl 文件。如果未提供验证数据集，则会留出一定量的训练数据用于验证。在选择用于微调模型的超参数时，可以调整用于验证的训练数据比例。

### 将微调数据上传到 Amazon S3
<a name="jumpstart-foundation-models-fine-tuning-instruction-based-upload-data"></a>

将准备好的数据上传到亚马逊简单存储服务 (Amazon S3)，以便在微调 JumpStart 基础模型时使用。您可以使用以下命令上传数据：

```
from sagemaker.s3 import S3Uploader
import sagemaker
import random

output_bucket = sagemaker.Session().default_bucket()
local_data_file = "train.jsonl"
train_data_location = f"s3://{output_bucket}/dolly_dataset"
S3Uploader.upload(local_data_file, train_data_location)
S3Uploader.upload("template.json", train_data_location)
print(f"Training data: {train_data_location}")
```

## 创建基于指令的微调的训练作业
<a name="jumpstart-foundation-models-fine-tuning-instruction-based-train"></a>

将数据上传到 Amazon S3 后，您可以微调和部署 JumpStart 基础模型。要在 Studio 中微调您的模型，请参阅 [在 Studio 中微调模型](jumpstart-foundation-models-use-studio-updated-fine-tune.md)。要使用 SageMaker Python SDK 微调模型，请参阅[使用 `JumpStartEstimator` 类微调公开可用的基础模型](jumpstart-foundation-models-use-python-sdk-estimator-class.md)。

## 示例笔记本
<a name="jumpstart-foundation-models-fine-tuning-instruction-based-examples"></a>

有关基于指令的微调的更多信息，请参阅以下示例笔记本：
+ [微调 LLa MA 2 机型 JumpStart](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/jumpstart-foundation-models/llama-2-finetuning.html)
+ [简介 SageMaker JumpStart -使用 Mistral 模型生成文本](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/jumpstart-foundation-models/mistral-7b-instruction-domain-adaptation-finetuning.html)
+ [简介 SageMaker JumpStart -使用 Falcon 模型生成文本](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/jumpstart-foundation-models/falcon-7b-instruction-domain-adaptation-finetuning.html)
+ [SageMaker JumpStart 基础模型- HuggingFace Text2Text 指令微调](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/jumpstart-foundation-models/instruction-fine-tuning-flan-t5.html)