微调 (Snowflake Cortex)¶
Snowflake Cortex Fine-tuning 函数提供了一种为特定任务定制大型语言模型的方法。本主题描述了该功能的工作原理以及如何开始创建您自己的微调模型。
概述¶
Cortex Fine-tuning 允许用户利用高效的参数微调功能 (PEFT) 来创建自定义适配器,以便在更专业的任务中与预训练模型配合使用。如果不想花高昂的成本从头开始训练一个大型模型,但又需要比提示工程甚至检索增强生成 (RAG) 方法更好的延迟和结果,那么微调现有的大型模型不失为一种选择。微调允许您使用示例来调整模型的行为,并提高模型对特定领域任务的认识。
Cortex Fine-tuning 是一项完全托管式服务,可让您在 Snowflake 中使用自己的数据对流行的 LLMs 进行微调。
Cortex Fine-tuning 功能作为 Snowflake Cortex 函数提供,FINETUNE,具有以下参数:
成本注意事项¶
Snowflake Cortex Fine-tuning 函数的计算成本基于训练中使用的词元数量。此外,在微调模型上运行 COMPLETE 函数会产生计算成本,具体取决于处理的词元数量。请参阅 Snowflake 服务使用量表,以了解每个函数的每百万个词元消耗的 credit 成本。
词元是 Snowflake Cortex Fine-tuning 函数处理的最小文本单位,大约等于四个字符的文本。原始输入或输出文本与词元的等价性可能因模型而异。
对于在响应中生成新文本的 COMPLETE 函数,输入和输出词元都会统计在内。
微调训练的词元的计算方式如下:
Fine-tuning trained tokens = number of input tokens * number of epochs trained
使用 FINETUNE ('DESCRIBE') (SNOWFLAKE.CORTEX) 查看您微调作业中训练的词元数量。
其他注意事项¶
访问控制要求¶
要运行微调作业,创建微调作业的角色需要具备以下权限:
权限 |
对象 |
备注 |
---|---|---|
USAGE |
DATABASE |
从中查询训练(和验证)数据的数据库。 |
(CREATE MODEL 和 USAGE)或 OWNERSHIP |
SCHEMA |
模型保存到的架构。 |
以下 SQL 示例展示了如何为角色 my_role
授予 my_schema
的 CREATE MODEL 权限。
GRANT CREATE MODEL ON SCHEMA my_schema TO ROLE my_role;
此外,要使用 FINETUNE 函数,ACCOUNTADMIN 角色必须将 SNOWFLAKE.CORTEX_USER 数据库角色授予将调用该函数的用户。有关详细信息,请参阅 LLM 函数所需权限 主题。
要让其他角色访问使用微调模型,须授予对该模型的使用权限。有关详细信息,请参阅 模型权限。
可进行微调的模型¶
以下基础模型可以进行微调。未来可能会增加或移除可进行微调的模型:
名称 |
描述 |
---|---|
|
来自 Meta 的大型语言模型非常适合需要低到中等推理量且准确性高于 |
|
来自 Meta 的 LLM 提供先进的性能,非常适合聊天应用程序、内容创建和企业应用程序。 |
|
来自 Meta 的大型语言模型非常适合需要低到中等推理量的任务。它是一个轻量级、超快速模型,具有 128000 的上下文窗口。 |
|
这是一种开源模型,具有先进的性能,非常适合聊天应用程序、内容创建和企业应用程序。它是一种高性能、高性价比的模型,可通过 128000 的上下文窗口实现各种用例。 |
|
来自 Mistral AI 的 70 亿参数大型语言模型非常适合需要快速完成的最简单总结、结构化处理和问答任务。它通过其 32000 上下文窗口为多页文本提供低延迟和高吞吐量处理。 |
|
来自 Mistral AI 的大型语言模型非常适合文本生成、分类和问答用途。Mistral 模型针对低延迟和低内存要求进行了优化,从而能为企业用例带来更高吞吐量。 |
如何微调模型¶
调整模型的整体工作流程如下:
一旦训练完成,即可使用 Cortex Fine-tuning 提供的模型名称对模型进行推理。
准备训练数据¶
训练数据必须来自 Snowflake 表或视图,并且查询结果必须包含名为 prompt
和 completion
的列。若表或视图没有包含所需名称的列,请在查询中使用列别名为它们命名。此查询作为参数提供给 FINETUNE 函数。如果结果不包含 prompt
和 completion
列名,您将会收到错误。
备注
除了提示和完成列之外,FINETUNE 函数将忽略所有其他列。Snowflake 建议使用仅选择所需列的查询。
以下代码调用了 FINETUNE 函数,并使用 SELECT ... AS
语法将查询结果中的两列设置为 prompt
和 completion
。
SELECT SNOWFLAKE.CORTEX.FINETUNE(
'CREATE',
'my_tuned_model',
'mistral-7b',
'SELECT a AS prompt, d AS completion FROM train',
'SELECT a AS prompt, d AS completion FROM validation'
);
提示是对 LLM 的输入,而完成是来自 LLM 的响应。训练数据应包括提示和完成对,以展示您希望模型如何响应特定提示。
以下是有关训练数据的其他建议和要求,用于获得最佳微调性能。
从几百个示例开始。从过多的示例开始可能会大幅增加调整时间,而性能的改善却微乎其微。
每个示例必须仅使用分配给您正在调整的基础模型的上下文窗口的一部分。上下文窗口由词元定义。词元是 Snowflake Cortex 函数处理的最小文本单位,大约等于四个字符的文本。
下表定义了为每个基础模型
prompt
和completion
分配的上下文窗口部分:模型
上下文窗口
输入上下文(提示)
输出上下文(完成)
llama3-8b
8000
6000
2000
llama3-70b
8000
6000
2000
llama3.1-8b
24000
20000
4000
llama3.1-70b
16000
12000
4000
mistral-7b
32000
28000
4000
mixtral-8x7b
32000
28000
4000
开始微调作业¶
您可以通过调用 SNOWFLAKE.CORTEX.FINETUNE 函数并将 'CREATE' 作为第一个参数 来开始微调作业,或者使用 Snowsight。
使用 SQL¶
该示例使用 mistral-7b
模型作为基础模型,创建一个模型输出名称为 my_tuned_model
的作业,并分别从 my_training_data
和 my_validation_data
表中查询训练和验证数据。
USE DATABASE mydb;
USE SCHEMA myschema;
SELECT SNOWFLAKE.CORTEX.FINETUNE(
'CREATE',
'my_tuned_model',
'mistral-7b',
'SELECT prompt, completion FROM my_training_data',
'SELECT prompt, completion FROM my_validation_data'
);
若想为每个数据库对象使用不同的数据库和架构,例如模型或数据,可以使用每个数据库对象的绝对路径。以下示例展示了如何使用来自 mydb2.myschema2
数据库和架构的数据创建微调作业,并将微调后的模型保存到 mydb.myschema
数据库和架构。
SELECT SNOWFLAKE.CORTEX.FINETUNE(
'CREATE',
'mydb.myschema.my_tuned_model',
'mistral-7b',
'SELECT prompt, completion FROM mydb2.myschema2.my_training_data',
'SELECT prompt, completion FROM mydb2.myschema2.my_validation_data'
);
SNOWFLAKE.CORTEX.FINETUNE 函数以 'CREATE' 作为第一个参数,返回一个微调模型 ID 作为输出。使用该 ID,通过第一个参数为 'DESCRIBE' <label-cortex_finetuning_describe>` 的 :ref:`SNOWFLAKE.CORTEX.FINETUNE 函数来获取状态或作业进度。
使用 Snowsight¶
按照以下步骤在 Snowsight 中创建微调作业:
登录 Snowsight。
选择被授予 SNOWFLAKE.CORTEX_USER 数据库角色的角色。
在导航菜单中,选择 AI & ML » Studio。
从 Create Custom LLM 框中选择 Fine-tune。
使用下拉菜单选择基础模型。
选择微调作业将以其名义执行的角色和其运行所在仓库。该角色必须获授 SNOWFLAKE.CORTEX_USER 数据库角色。
选择一个数据库来存储微调后的模型。
输入微调模型名称,然后选择 Let's go。
选择包含训练数据的表或视图,然后选择 Next。训练数据可以来自角色可以访问的任何数据库或架构。
选择包含训练数据中提示的列,然后选择 Next。
选择包含训练数据中完成的列,然后选择 Next。
如有验证数据集,请选择包含验证数据的表或视图,然后选择 Next。若没有单独的验证数据,请选择 Skip this option。
验证选择,然后选择 Start training。
最后一步确认微调作业已开始,并显示 Job ID。使用该 ID,通过第一个参数为 'DESCRIBE' <label-cortex_finetuning_describe>` 的 :ref:`SNOWFLAKE.CORTEX.FINETUNE 函数来获取状态或作业进度。
管理微调后的模型¶
微调作业运行时间较长,这意味着它们不与工作表会话绑定。您可以使用第一个参数为 'SHOW' 或 'DESCRIBE' 的 SNOWFLAKE.CORTEX.FINETUNE 函数检查微调作业状态。
若不再需要进行微调作业,可以使用第一个参数为 'CANCEL' <label-cortex_finetuning_cancel>` 且第二个参数为作业 ID 的 :ref:`SNOWFLAKE.CORTEX.FINETUNE 函数将其终止。
使用微调模型进行推理¶
使用带有微调模型名称的 COMPLETE LLM 函数 进行推理。
这个示例展示了对使用微调模型名称的 COMPLETE 函数的调用。
SELECT SNOWFLAKE.CORTEX.COMPLETE(
'my_tuned_model',
'How to fine-tune mistral models'
);
以下是示例调用的输出片段:
Mistral models are a type of deep learning model used for image recognition and classification. Fine-tuning a Mistral model involves adjusting the model's parameters to ...
限制和已知问题¶
微调作业仅可在账户级别列出。
从 FINETUNE ('SHOW') (SNOWFLAKE.CORTEX) 返回的微调作业非永久性的,可能会定期进行垃圾回收。
如果从 Cortex LLM 函数中移除基础模型,微调模型将不再运作。
复制模型¶
跨区域推理 不支持微调模型。推理必须在模型对象所在的同一区域进行。如果微调模型对象所在区域与训练模型的区域不同,您可以使用 Database Replication 功能,将微调模型对象复制到您想要进行推理的区域。
例如,如果您在 AWS US 西部 2 区域的账户中创建了基于 mistral-7b
的微调模型,您可以使用数据共享功能将其与该区域的另一个账户共享,也可以使用 Database Replication 功能将模型复制到组织中支持 mistral-7b
模型的不同区域(如 AWS 欧洲西部)的另一个账户。有关复制对象的详细信息,请参阅 跨多个账户复制数据库和账户对象。
法律声明¶
输入和输出的 Data Classification 如下表所示。
输入 Data Classification |
输出 Data Classification |
名称 |
---|---|---|
Usage Data |
Customer Data |
Preview AI Features [1] |
有关更多信息,请参阅 Snowflake AI 和 ML。