微调 (Snowflake Cortex)

Snowflake Cortex Fine-tuning 函数提供了一种为特定任务定制大型语言模型的方法。本主题描述了该功能的工作原理以及如何开始创建您自己的微调模型。

概述

Cortex Fine-tuning 允许用户利用高效的参数微调功能 (PEFT) 来创建自定义适配器,以便在更专业的任务中与预训练模型配合使用。如果不想花高昂的成本从头开始训练一个大型模型,但又需要比提示工程甚至检索增强生成 (RAG) 方法更好的延迟和结果,那么微调现有的大型模型不失为一种选择。微调允许您使用示例来调整模型的行为,并提高模型对特定领域任务的认识。

Cortex Fine-tuning 是一项完全托管式服务,可让您在 Snowflake 中使用自己的数据对流行的 LLMs 进行微调。

Cortex Fine-tuning 功能作为 Snowflake Cortex 函数提供,FINETUNE,具有以下参数:

  • CREATE:创建一个具有给定训练数据的微调作业。

  • SHOW:列出当前角色可以访问的所有微调作业。

  • DESCRIBE:描述特定微调作业的进展和状态。

  • CANCEL:取消给定的微调作业。

成本注意事项

Snowflake Cortex Fine-tuning 函数的计算成本基于训练中使用的词元数量。此外,在微调模型上运行 COMPLETE 函数会产生计算成本,具体取决于处理的词元数量。请参阅 Snowflake 服务使用量表,以了解每个函数的每百万个词元消耗的 credit 成本。

词元是 Snowflake Cortex Fine-tuning 函数处理的最小文本单位,大约等于四个字符的文本。原始输入或输出文本与词元的等价性可能因模型而异。

  • 对于在响应中生成新文本的 COMPLETE 函数,输入和输出词元都会统计在内。

  • 微调训练的词元的计算方式如下:

    Fine-tuning trained tokens = number of input tokens * number of epochs trained
    
    Copy

    使用 FINETUNE ('DESCRIBE') (SNOWFLAKE.CORTEX) 查看您微调作业中训练的词元数量。

其他注意事项

  • 除了调整和推理产生的费用外,还有正常的 存储仓库 成本,用于存储输出定制适配器,以及运行任何 SQL 命令。

  • 微调作业通常运行时间较长,且不附加至工作表会话。

  • 以下限制适用于每个模型的训练/验证数据集大小:

    模型

    训练数据限制

    llama3-8b

    1 GB

    llama3-70b

    250 MB

    llama3.1-8b

    1 GB

    llama3.1-70b

    250 MB

    mistral-7b

    1 GB

    mixtral-8x7b

    250 MB

访问控制要求

要运行微调作业,创建微调作业的角色需要具备以下权限:

权限

对象

备注

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;
Copy

此外,要使用 FINETUNE 函数,ACCOUNTADMIN 角色必须将 SNOWFLAKE.CORTEX_USER 数据库角色授予将调用该函数的用户。有关详细信息,请参阅 LLM 函数所需权限 主题。

要让其他角色访问使用微调模型,须授予对该模型的使用权限。有关详细信息,请参阅 模型权限

可进行微调的模型

以下基础模型可以进行微调。未来可能会增加或移除可进行微调的模型:

名称

描述

llama3-8b

来自 Meta 的大型语言模型非常适合需要低到中等推理量且准确性高于 llama2-70b-chat 模型的任务,如文本分类、摘要和情绪分析。

llama3-70b

来自 Meta 的 LLM 提供先进的性能,非常适合聊天应用程序、内容创建和企业应用程序。

llama3.1-8b

来自 Meta 的大型语言模型非常适合需要低到中等推理量的任务。它是一个轻量级、超快速模型,具有 128000 的上下文窗口。

llama3.1-70b

这是一种开源模型,具有先进的性能,非常适合聊天应用程序、内容创建和企业应用程序。它是一种高性能、高性价比的模型,可通过 128000 的上下文窗口实现各种用例。llama3-70b 仍受支持,其上下文窗口为 8000。

mistral-7b

来自 Mistral AI 的 70 亿参数大型语言模型非常适合需要快速完成的最简单总结、结构化处理和问答任务。它通过其 32000 上下文窗口为多页文本提供低延迟和高吞吐量处理。

mixtral-8x7b

来自 Mistral AI 的大型语言模型非常适合文本生成、分类和问答用途。Mistral 模型针对低延迟和低内存要求进行了优化,从而能为企业用例带来更高吞吐量。

如何微调模型

调整模型的整体工作流程如下:

  1. 准备训练数据

  2. 使用所需参数开始微调作业

  3. 监控训练作业

一旦训练完成,即可使用 Cortex Fine-tuning 提供的模型名称对模型进行推理。

准备训练数据

训练数据必须来自 Snowflake 表或视图,并且查询结果必须包含名为 promptcompletion 的列。若表或视图没有包含所需名称的列,请在查询中使用列别名为它们命名。此查询作为参数提供给 FINETUNE 函数。如果结果不包含 promptcompletion 列名,您将会收到错误。

备注

除了提示和完成列之外,FINETUNE 函数将忽略所有其他列。Snowflake 建议使用仅选择所需列的查询。

以下代码调用了 FINETUNE 函数,并使用 SELECT ... AS 语法将查询结果中的两列设置为 promptcompletion

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'
);
Copy

提示是对 LLM 的输入,而完成是来自 LLM 的响应。训练数据应包括提示和完成对,以展示您希望模型如何响应特定提示。

以下是有关训练数据的其他建议和要求,用于获得最佳微调性能。

  • 从几百个示例开始。从过多的示例开始可能会大幅增加调整时间,而性能的改善却微乎其微。

  • 每个示例必须仅使用分配给您正在调整的基础模型的上下文窗口的一部分。上下文窗口由词元定义。词元是 Snowflake Cortex 函数处理的最小文本单位,大约等于四个字符的文本。

  • 下表定义了为每个基础模型 promptcompletion 分配的上下文窗口部分:

    模型

    上下文窗口

    输入上下文(提示)

    输出上下文(完成)

    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_datamy_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'
);
Copy

若想为每个数据库对象使用不同的数据库和架构,例如模型或数据,可以使用每个数据库对象的绝对路径。以下示例展示了如何使用来自 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'
);
Copy

SNOWFLAKE.CORTEX.FINETUNE 函数以 'CREATE' 作为第一个参数,返回一个微调模型 ID 作为输出。使用该 ID,通过第一个参数为 'DESCRIBE' <label-cortex_finetuning_describe>` 的 :ref:`SNOWFLAKE.CORTEX.FINETUNE 函数来获取状态或作业进度。

使用 Snowsight

按照以下步骤在 Snowsight 中创建微调作业:

  1. 登录 Snowsight。

  2. 选择被授予 SNOWFLAKE.CORTEX_USER 数据库角色的角色。

  3. 在导航菜单中,选择 AI & ML » Studio

  4. Create Custom LLM 框中选择 Fine-tune

  5. 使用下拉菜单选择基础模型。

  6. 选择微调作业将以其名义执行的角色和其运行所在仓库。该角色必须获授 SNOWFLAKE.CORTEX_USER 数据库角色。

  7. 选择一个数据库来存储微调后的模型。

  8. 输入微调模型名称,然后选择 Let's go

  9. 选择包含训练数据的表或视图,然后选择 Next。训练数据可以来自角色可以访问的任何数据库或架构。

  10. 选择包含训练数据中提示的列,然后选择 Next

  11. 选择包含训练数据中完成的列,然后选择 Next

  12. 如有验证数据集,请选择包含验证数据的表或视图,然后选择 Next。若没有单独的验证数据,请选择 Skip this option

  13. 验证选择,然后选择 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'
);
Copy

以下是示例调用的输出片段:

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 函数中移除基础模型,微调模型将不再运作。

共享模型

可以通过 数据共享 与具有 USAGE 权限的其他账户共享微调模型。

复制模型

跨区域推理 不支持微调模型。推理必须在模型对象所在的同一区域进行。如果微调模型对象所在区域与训练模型的区域不同,您可以使用 Database Replication 功能,将微调模型对象复制到您想要进行推理的区域。

例如,如果您在 AWS US 西部 2 区域的账户中创建了基于 mistral-7b 的微调模型,您可以使用数据共享功能将其与该区域的另一个账户共享,也可以使用 Database Replication 功能将模型复制到组织中支持 mistral-7b 模型的不同区域(如 AWS 欧洲西部)的另一个账户。有关复制对象的详细信息,请参阅 跨多个账户复制数据库和账户对象

语言: 中文