Hugging Face:用开源合成数据低成本训练定制模型
Synthetic data: save money, time and carbon with open source
Hugging Face 博客以金融新闻投资者情绪识别为例,展示用开源 Mixtral-8x7B-Instruct-v0.1 生成合成数据、再用 AutoTrain 蒸馏出约 0.13B 参数的 RoBERTa 分类模型的流程。
以金融情绪识别为例,给出用开源 LLM 生成合成数据再蒸馏小模型的可复用流程与成本对比。
简而言之
你应该微调自己的模型还是使用 LLM API?创建自己的模型让你拥有完全的控制权,但需要数据收集、训练和部署方面的专业知识。LLM API 使用起来要容易得多,但会迫使你把数据发送给第三方,并对 LLM 提供商产生代价高昂的依赖。这篇博客文章展示了如何将 LLM 的便利性与定制模型的控制力和效率结合起来。
在一项关于识别新闻中投资者情绪的案例研究中,我们展示了如何使用开源 LLM 在几个步骤内创建合成数据来训练你的定制模型。我们得到的定制 RoBERTa 模型分析一个大型新闻语料的成本约为 $2.7,而 GPT4 为 $3061;排放约 0.12 kg CO2,而 GPT4 大约为 735 到 1100 kg CO2;延迟为 0.13 秒,而 GPT4 往往是数秒;同时在识别投资者情绪方面与 GPT4 表现相当(两者准确率均为 94%,F1 macro 均为 0.94)。我们提供了可复用的 notebook,你可以将其应用到自己的用例中。
目录
1. 问题:你的用例没有数据
想象你的老板让你为公司构建一个情感分析系统。你会在 HF Mirror Hub 上找到 100,000+ 个数据集,其中约 450 个标题中含有 “sentiment” 一词,涵盖 Twitter、诗歌或希伯来语中的情感。这很棒,但例如,如果你在一家金融机构工作,并且需要跟踪对你投资组合中特定品牌的情绪,那么这些数据集对你的任务都没有用。鉴于公司可以用机器学习处理数百万种任务,不太可能已经有人为你公司试图解决的确切用例收集并发布了数据。
鉴于缺乏特定任务的数据集和模型,许多人转向通用 LLM。这些模型如此庞大且通用,以至于它们可以开箱即用地处理大多数任务,并具有令人印象深刻的准确率。它们易于使用的 API 消除了对微调和部署专业知识的需求。它们的主要缺点是规模和可控性:拥有数千亿或数万亿参数,这些模型效率低下,并且只能在由少数几家公司控制的算力集群上运行。
2. 解决方案:用合成数据教出高效的学生
2023 年,一项进展从根本上改变了机器学习的格局:LLM 开始达到与人类数据标注者相当的水平。如今有大量证据表明,最优秀的 LLM 在创建高质量(合成)数据方面已超越众包工作者,并正在达到与专家相当的水平(例如 Zheng et al. 2023、Gilardi et al. 2023、He et al. 2023)。这一进展的重要性怎么强调都不为过。创建定制模型的关键瓶颈在于招募和协调人工工作者来创建定制训练数据所需的资金、时间和专业知识。随着 LLM 开始达到人类水平,高质量的标注劳动力现在可以通过 API 获得;可复现的标注指令可以作为提示发送;合成数据几乎可以即时返回,唯一的瓶颈是算力。
2024 年,这种方法将变得具有商业可行性,并提升开源对小企业和大型企业的价值。在 2023 年的大部分时间里,由于 LLM API 提供商限制性的商业条款,将 LLM 用于标注劳动力的商业用途受到阻碍。借助 Mistral 的 Mixtral-8x7B-Instruct-v0.1 等模型,LLM 标注劳动力和合成数据现在可以开放用于商业用途。Mixtral 的表现与 GPT3.5 相当,并且得益于其 Apache 2.0 许可证,其合成数据输出可以用作更小的专用模型(“学生”)的训练数据,用于商业用例。这篇博文提供了一个示例,说明这将如何显著加速你自己定制模型的创建,同时大幅降低长期推理成本。
3. 案例研究:监控金融情绪
想象你是一家大型投资公司的开发者,任务是监控经济新闻对你投资组合中公司的情绪。直到最近,你有两个主要选择:
你可以微调自己的模型。这需要编写标注指令、创建标注界面、招募(众包)工作者、引入质量保证措施以处理低质量数据、在此数据上微调模型,然后部署它。
或者你可以将数据和指令发送到 LLM API。你完全跳过微调和部署,将数据分析过程简化为编写指令(提示),然后发送给 API 背后的“LLM 标注器”。在这种情况下,LLM API 就是你最终的推理解决方案,你直接使用 LLM 的输出来进行分析。
尽管选项 2 在推理时更昂贵,并且需要你将敏感数据发送给第三方,但它比选项 1 更容易设置,因此被许多开发者使用。
2024 年,合成数据提供了第三种选择:将选项 1 的成本优势与选项 2 的易用性结合起来。简而言之,你可以使用一个 LLM(“教师”)为你标注一小部分数据,然后在这个数据上微调一个更小、更高效的 LM(“学生”)。这种方法可以通过几个简单步骤实现。
3.1 提示 LLM 标注你的数据
我们使用 financial_phrasebank 情感数据集作为运行示例,但你可以将代码修改用于任何其他用例。financial_phrasebank 任务是一个 3 分类任务,其中 16 位专家从投资者视角将来自芬兰公司财经新闻的句子标注为“正面”/“负面”/“中性”(Malo et al. 2013)。例如,该数据集中包含句子“For the last quarter of 2010, Componenta's net sales doubled to EUR131m from EUR76m for the same period a year earlier”,标注者从投资者视角将其归类为“正面”。
我们首先安装几个所需的库。
!pip install datasets # for loading the example dataset
!pip install huggingface_hub # for secure token handling
!pip install requests # for making API requests
!pip install scikit-learn # for evaluation metrics
!pip install pandas # for post-processing some data
!pip install tqdm # for progress bars
然后,我们可以下载带有专家标注的示例数据集。
from datasets import load_dataset
dataset = load_dataset("financial_phrasebank", "sentences_allagree", split='train')
# create a new column with the numeric label verbalised as label_text (e.g. "positive" instead of "0")
label_map = {
i: label_text
for i, label_text in enumerate(dataset.features["label"].names)
}
def add_label_text(example):
example["label_text"] = label_map[example["label"]]
return example
dataset = dataset.map(add_label_text)
print(dataset)
# Dataset({
# features: ['sentence', 'label', 'label_text'],
# num_rows: 2264
#})
现在我们为 financial_phrasebank 任务编写一段简短的标注指令,并将其格式化为 LLM 提示。这个提示类似于你通常提供给众包工作者的说明。
prompt_financial_sentiment = """\
You are a highly qualified expert trained to annotate machine learning training data.
Your task is to analyze the sentiment in the TEXT below from an investor perspective and label it with only one the three labels:
positive, negative, or neutral.
Base your label decision only on the TEXT and do not speculate e.g. based on prior knowledge about a company.
Do not provide any explanations and only respond with one of the labels as one word: negative, positive, or neutral
Examples:
Text: Operating profit increased, from EUR 7m to 9m compared to the previous reporting period.
Label: positive
Text: The company generated net sales of 11.3 million euro this year.
Label: neutral
Text: Profit before taxes decreased to EUR 14m, compared to EUR 19m in the previous period.
Label: negative
Your TEXT to analyse:
TEXT: {text}
Label: """
在将此提示传递给 API 之前,我们需要为提示添加一些格式。如今大多数 LLM 都使用特定的聊天模板进行了微调。该模板由特殊 token 组成,使 LLM 能够区分聊天历史中的用户指令、系统提示及其自身响应。尽管我们在这里并未将模型用作聊天机器人,但省略聊天模板仍可能导致性能悄然下降。你可以使用 tokenizer 自动添加模型聊天模板的特殊 token(更多信息请阅读此处)。在我们的示例中,我们使用 Mixtral-8x7B-Instruct-v0.1 模型。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")
chat_financial_sentiment = [{"role": "user", "content": prompt_financial_sentiment}]
prompt_financial_sentiment = tokenizer.apply_chat_template(chat_financial_sentiment, tokenize=False)
# The prompt now includes special tokens: '<s>[INST] You are a highly qualified expert ... [/INST]'
现在,可以将格式化后的标注指令(提示)传递给 LLM API。我们使用免费的 HF Mirror 无服务器 Inference API。该 API 非常适合测试流行的模型。请注意,如果你向免费 API 发送过多数据,可能会遇到速率限制,因为它由许多用户共享。对于更大的工作负载,我们建议创建一个专用 Inference Endpoint。专用 Inference Endpoint 本质上是你自己的个人付费 API,可以灵活地开启和关闭。
我们使用 huggingface_hub 库登录,以便轻松、安全地处理我们的 API token。或者,你也可以将 token 定义为环境变量(参见文档)。
# you need a huggingface account and create a token here: https://hf-mirror.com/settings/tokens
# we can then safely call on the token with huggingface_hub.get_token()
import huggingface_hub
huggingface_hub.login()
然后,我们定义一个简单的 generate_text 函数,用于将提示和数据发送到 API。
import os
import requests
# Choose your LLM annotator
# to find available LLMs see: https://hf-mirror.com/docs/huggingface_hub/main/en/package_reference/inference_client#huggingface_hub.InferenceClient.list_deployed_models
API_URL = "https://api-inference.hf-mirror.com/models/mistralai/Mixtral-8x7B-Instruct-v0.1"
# docs on different parameters: https://hf-mirror.com/docs/api-inference/detailed_parameters#text-generation-task
generation_params = dict(
top_p=0.90,
temperature=0.8,
max_new_tokens=128,
return_full_text=False,
use_cache=False
)
def generate_text(prompt=None, generation_params=None):
payload = {
"inputs": prompt,
"parameters": {**generation_params}
}
response = requests.post(
API_URL,
headers={"Authorization": f"Bearer {huggingface_hub.get_token()}"},
json=payload
)
return response.json()[0]["generated_text"]
由于 LLM 可能并不总是以完全相同的统一格式返回标签,我们还定义了一个简短的 clean_output 函数,用于将 LLM 的字符串输出映射到我们的三个可能标签。
labels = ["positive", "negative", "neutral"]
def clean_output(string, random_choice=True):
for category in labels:
if category.lower() in string.lower():
return category
# if the output string cannot be mapped to one of the categories, we either return "FAIL" or choose a random label
if random_choice:
return random.choice(labels)
else:
return "FAIL"
现在,我们可以将文本发送给 LLM 进行标注。下面的代码将每段文本发送到 LLM API,并将文本输出映射到我们的三个干净类别。注意:在实践中,逐个遍历每段文本并分别发送到 API 是低效的。API 可以同时处理多段文本,你可以通过异步向 API 发送批量文本,显著加快 API 调用速度。你可以在本博客文章的复现仓库中找到优化后的代码。
output_simple = []
for text in dataset["sentence"]:
# add text into the prompt template
prompt_formatted = prompt_financial_sentiment.format(text=text)
# send text to API
output = generate_text(
prompt=prompt_formatted, generation_params=generation_params
)
# clean output
output_cl = clean_output(output, random_choice=True)
output_simple.append(output_cl)
基于此输出,我们现在可以计算指标,看看模型在未针对该任务进行训练的情况下完成任务的准确率如何。
from sklearn.metrics import classification_report
def compute_metrics(label_experts, label_pred):
# classification report gives us both aggregate and per-class metrics
metrics_report = classification_report(
label_experts, label_pred, digits=2, output_dict=True, zero_division='warn'
)
return metrics_report
label_experts = dataset["label_text"]
label_pred = output_simple
metrics = compute_metrics(label_experts, label_pred)
基于这个简单提示,LLM 正确分类了 91.6% 的文本(准确率 0.916,F1 macro 0.916)。考虑到它并未针对这个特定任务进行训练,这已经相当不错了。
我们可以通过使用两种简单的提示技术来进一步改进这一点:思维链(CoT)和自洽性(SC)。CoT 要求模型首先对正确标签进行推理,然后再做出标注决定,而不是立即决定正确标签。SC 意味着将相同的提示和相同的文本多次发送给同一个 LLM。SC 有效地为 LLM 提供了针对每段文本的多次尝试,并采用不同的推理路径,如果 LLM 随后两次回答“positive”、一次回答“neutral”,我们就选择多数结果(“positive”)作为正确标签。以下是我们为 CoT 和 SC 更新后的提示:
prompt_financial_sentiment_cot = """\
You are a highly qualified expert trained to annotate machine learning training data.
Your task is to briefly analyze the sentiment in the TEXT below from an investor perspective and then label it with only one the three labels:
positive, negative, neutral.
Base your label decision only on the TEXT and do not speculate e.g. based on prior knowledge about a company.
You first reason step by step about the correct label and then return your label.
You ALWAYS respond only in the following JSON format: {{"reason": "...", "label": "..."}}
You only respond with one single JSON response.
Examples:
Text: Operating profit increased, from EUR 7m to 9m compared to the previous reporting period.
JSON response: {{"reason": "An increase in operating profit is positive for investors", "label": "positive"}}
Text: The company generated net sales of 11.3 million euro this year.
JSON response: {{"reason": "The text only mentions financials without indication if they are better or worse than before", "label": "neutral"}}
Text: Profit before taxes decreased to EUR 14m, compared to EUR 19m in the previous period.
JSON response: {{"reason": "A decrease in profit is negative for investors", "label": "negative"}}
Your TEXT to analyse:
TEXT: {text}
JSON response: """
# we apply the chat template like above
chat_financial_sentiment_cot = [{"role": "user", "content": prompt_financial_sentiment_cot}]
prompt_financial_sentiment_cot = tokenizer.apply_chat_template(chat_financial_sentiment_cot, tokenize=False)
# The prompt now includes special tokens: '<s>[INST] You are a highly qualified expert ... [/INST]'
这是一个 JSON 提示,我们要求 LLM 返回一个结构化 JSON 字符串,其中“reason”作为一个键,“label”作为另一个键。JSON 的主要优势在于我们可以将其解析为 Python 字典,然后提取“label”。如果我们想了解 LLM 选择该标签的推理过程,也可以提取“reason”。
process_output_cot 函数会解析 LLM 返回的 JSON 字符串,并且在 LLM 未返回有效 JSON 的情况下,它会尝试通过上面定义的 clean_output 函数进行简单字符串匹配来识别标签。
import ast
def process_output_cot(output):
try:
output_dic = ast.literal_eval(output)
return output_dic
except Exception as e:
# if json/dict parse fails, do simple search for occurrence of first label term
print(f"Parsing failed for output: {output}, Error: {e}")
output_cl = clean_output(output, random_choice=False)
output_dic = {"reason": "FAIL", "label": output_cl}
return output_dic
现在,我们可以复用上面定义的 generate_text 函数并使用新的提示,通过 process_output_cot 处理 JSON 思维链输出,并多次发送每个提示以实现自洽性。
self_consistency_iterations = 3
output_cot_multiple = []
for _ in range(self_consistency_iterations):
output_lst_step = []
for text in tqdm(dataset["sentence"]):
prompt_formatted = prompt_financial_sentiment_cot.format(text=text)
output = generate_text(
prompt=prompt_formatted, generation_params=generation_params
)
output_dic = process_output_cot(output)
output_lst_step.append(output_dic["label"])
output_cot_multiple.append(output_lst_step)
对于每段文本,我们的 LLM 标注器现在都有三次尝试,通过三条不同的推理路径来识别正确标签。下面的代码从这三条路径中选择多数标签。
import pandas as pd
from collections import Counter
def find_majority(row):
# Count occurrences
count = Counter(row)
# Find majority
majority = count.most_common(1)[0]
# Check if it's a real majority or if all labels are equally frequent
if majority[1] > 1:
return majority[0]
else: # in case all labels appear with equal frequency
return random.choice(labels)
df_output = pd.DataFrame(data=output_cot_multiple).T
df_output['label_pred_cot_multiple'] = df_output.apply(find_majority, axis=1)
现在,我们可以再次将改进后的 LLM 标签与专家标签进行比较,并计算指标。
label_experts = dataset["label_text"]
label_pred_cot_multiple = df_output['label_pred_cot_multiple']
metrics_cot_multiple = compute_metrics(label_experts, label_pred_cot_multiple)
CoT 和 SC 将性能提升到了 94.0% 的准确率和 0.94 的 F1 macro。我们通过让模型有时间思考其标签决定并给予其多次尝试,提高了性能。请注意,CoT 和 SC 会消耗额外的计算资源。我们本质上是在用计算资源换取标注准确率。
得益于这些简单的 LLM API 调用,我们现在已经创建了一个合成训练数据集。我们通过让 LLM 在做出标签决定前尝试三条不同的推理路径,为每段文本打上了标签。其结果是与人类专家高度一致的标签,以及一个可用于训练更高效、更专用模型的高质量数据集。
df_train = pd.DataFrame({
"text": dataset["sentence"],
"labels": df_output['label_pred_cot_multiple']
})
df_train.to_csv("df_train.csv")
请注意,在这篇博客文章的完整复现脚本中,我们还仅基于专家标注创建了一个测试集,以评估所有模型的质量。所有指标始终基于这个人类专家测试集。
3.2 将开源模型与专有模型进行比较
使用开源 Mixtral 模型创建的数据的主要优势在于,这些数据完全可以商业使用,没有法律不确定性。例如,使用 OpenAI API 创建的数据受OpenAI 商业条款约束,这些条款明确禁止使用模型输出来训练与其产品和服务竞争的模型。这些条款的法律价值和含义并不明确,但它们为使用来自 OpenAI 模型的合成数据训练出的模型的商业使用带来了法律不确定性。任何使用合成数据训练的、更小、更高效的模型都可能被视为具有竞争性,因为它减少了对 API 服务的依赖。
Mistral 的开源 Mixtral-8x7B-Instruct-v0.1 与 OpenAI 的 GPT3.5 和 GPT4 在合成数据质量上相比如何?我们使用上文所述的相同流程和提示词,分别以 gpt-3.5-turbo-0613 和 gpt-4-0125-preview 运行,并在下表中报告了结果。我们可以看到,Mixtral 在此任务上表现优于 GPT3.5,并且根据提示词类型的不同,与 GPT4 不相上下。(我们在此不展示较新的 gpt-3.5-turbo-0125 的结果,因为出于某种原因,该模型的表现比旧的默认 gpt-3.5-turbo-0613 更差。)
请注意,这并不意味着 Mixtral 总是优于 GPT3.5 并与 GPT4 不相上下。GPT4 在多项基准测试中表现更好。主要信息是,开源模型现在能够创建高质量的合成数据。
3.3 理解并验证你的(合成)数据
这在实践中意味着什么?到目前为止,结果只是由某个黑盒 LLM 标注的数据。我们也只能计算指标,因为我们有来自示例数据集的专家标注参考数据。在现实场景中,如果我们没有专家标注,我们如何信任 LLM 的标注?
在实践中,无论你使用何种标注者(人工标注者或 LLM),你只能信任你自己验证过的数据。指令/提示词总是包含一定程度的不确定性。即使是一个完美智能的标注者也可能犯错,并且在面对通常具有模糊性的现实世界数据时必须做出不明确的决定。
幸运的是,过去几年里,借助开源工具,数据验证已变得容易得多:Argilla 提供了一个免费界面,用于验证和清理非结构化的 LLM 输出;LabelStudio 使你能够以多种模态标注数据;CleanLab 提供了一个用于标注和自动清理结构化数据的界面;对于快速简单的验证,仅仅在简单的 Excel 文件中进行标注也是可以的。
花一些时间标注文本,以感受数据及其模糊性是至关重要的。你很快会了解到模型犯了一些错误,但也会有一些示例中正确标签不明确,还有一些文本中你更同意 LLM 的决定,而不是创建数据集的专家的决定。这些错误和模糊性是数据集创建的正常组成部分。事实上,只有极少数现实世界任务中,人类专家基线能达到 100% 的一致性。这是一个古老的洞见,最近被机器学习文献“重新发现”:人类数据是一个有缺陷的金标准(Krippendorf 2004,Hosking et al. 2024)。
在标注界面中不到一小时后,我们对数据有了更好的理解,并纠正了一些错误。然而,为了可复现性并展示纯合成数据的质量,我们在下一步中继续使用未清理的 LLM 标注。
3.3 使用 AutoTrain 调优你的高效且专用模型
到目前为止,这还只是通过 API 提示 LLM 并验证输出的标准工作流程。现在,为了实现显著的资源节省,我们需要增加一个额外步骤:在 LLM 生成的合成数据上微调一个更小、更高效且专门化的 LM。这个过程也称为“蒸馏”,即利用较大模型(“教师”)的输出训练较小模型(“学生”)。虽然听起来很高级,但实际上只是将数据集中的原始 text 作为输入,并将 LLM 的预测作为微调的 labels。如果你之前训练过分类器,就会知道训练分类器只需要这两列数据,无论使用 transformers、sklearn 还是其他库。
我们使用 HF Mirror 的 AutoTrain 解决方案来进一步简化这个过程。AutoTrain 是一个无代码界面,允许你上传带有标注数据的 .csv 文件,服务会自动用它来微调模型。这样,你无需编写代码或具备深入的微调专业知识,就能训练自己的模型。
在 HF Mirror 网站上,我们首先点击顶部的“Spaces”,然后点击“Create new Space”。接着选择“Docker” > “AutoTrain”,并选择一个小的 A10G GPU,每小时费用为 $1.05。AutoTrain 的 Space 随后会初始化。然后我们可以通过界面上传合成训练数据和专家测试数据,并调整各个字段,如下方截图所示。填写完毕后,点击“Start Training”,你可以在 Space 的日志中跟踪训练过程。在仅 1811 个数据点上训练一个小型 RoBERTa-base 模型(约 0.13B 参数)非常快,不会超过几分钟。训练完成后,模型会自动上传到你的 HF 个人资料。训练结束后 Space 会停止,整个过程最多需要 15 分钟,费用不到 $1。
如果你愿意,也可以完全在本地自己的硬件上使用 AutoTrain,请参阅我们的文档。当然,高级用户随时可以编写自己的训练脚本,但使用这些默认超参数,AutoTrain 的结果对于许多分类任务来说已经足够。
我们最终微调的约 0.13B 参数 RoBERTa-base 模型与更大的 LLM 相比表现如何?下面的柱状图显示,在 1811 个文本上微调的自定义模型达到了 94% 的准确率——与其教师 Mixtral 和 GPT4 相同!小型模型开箱即用时永远无法与更大的 LLM 竞争,但在一些高质量数据上微调后,它在其专长任务上可以达到相同的性能水平。
3.4 不同方法的优缺点
我们一开始讨论的三种方法——(1) 手动创建自己的数据和模型,(2) 仅使用 LLM API,或 (3) 使用 LLM API 为专门模型创建合成数据——总体优缺点是什么?下表展示了不同因素之间的权衡,我们将在下面基于示例数据集讨论不同的指标。
让我们从任务性能开始。如上所示,专用模型的表现可与规模大得多的LLM相媲美。微调后的模型只能完成我们训练它执行的那一个特定任务,但它能非常出色地完成这个特定任务。要创建更多训练数据,使模型适应新的领域或更复杂的任务,这将是轻而易举的事。得益于来自LLM的合成数据,因缺乏专用数据而导致的低性能不再是一个问题。
其次,是计算成本和推理速度。实践中主要的计算成本将是推理,即在模型训练完成后运行它。假设在你的生产用例中,你需要在给定时间段内处理100万条句子。我们微调后的RoBERTa-base模型可在具有16GB RAM的小型T4 GPU上高效运行,在Inference Endpoint上每小时花费0.6美元。它的延迟为0.13秒,使用batch_size=8时的吞吐量为每秒61条句子。这导致处理100万条句子的总成本为2.7美元。
对于GPT模型,我们可以通过计算token来估算推理成本。使用GPT3.5处理100万条句子中的token将花费约153美元,而使用GPT4则约为3061美元。这些模型的延迟和吞吐量计算起来更为复杂,因为它们会因当前服务器负载而在一天中不断变化。然而,任何使用过GPT4的人都知道,延迟往往可能达到数秒,并且受到速率限制。请注意,速度对于任何LLM(API)来说都是一个问题,包括开源LLM。许多生成式LLM实在太大,无法做到快速。
训练计算成本往往不那么重要,因为LLM通常可以开箱即用而无需微调,而且较小模型的微调成本相对较低(微调RoBERTa-base的成本不到1美元)。只有在极少数情况下,你才需要投资从头预训练一个模型。当微调一个更大的生成式LLM以使其专门用于特定的生成任务时,训练成本可能会变得重要。
第三,所需的时间和专业知识投入。这是LLM API的主要优势所在。向API发送指令要比手动收集数据、微调自定义模型并部署它容易得多。这正是使用LLM API创建合成数据变得重要的地方。创建良好的训练数据变得容易得多。随后,微调和部署可以由AutoTrain和专用Inference Endpoints等服务来处理。
第四,控制权。这可能是LLM API的主要缺点。从设计上讲,LLM API使你依赖于LLM API提供商。你需要将敏感数据发送到别人的服务器,并且无法控制系统可靠性和速度。训练你自己的模型可以让你选择如何以及在哪里部署它。
最后是环境影响。鉴于缺乏有关模型架构和硬件基础设施的信息,很难估算像 GPT4 这样的闭源模型的能耗和 CO2 排放。我们找到的最佳(但非常粗略)估算显示,GPT4 每次查询的能耗约为 0.0017 至 0.0026 KWh。以此推算,分析 100 万句约需 1700 - 2600 KWh。根据EPA CO2 当量计算器,这相当于 0.735 - 1.1 公吨 CO2,或普通汽车行驶 1885 - 2883 英里。请注意,实际 CO2 排放量会因 LLM 特定计算区域的能源结构而有很大差异。使用我们的自定义模型则容易估算得多。用自定义模型分析 100 万句,在 T4 GPU 上约需 4.52 小时,在位于美国弗吉尼亚州北部的 AWS 服务器上,这会产生约 0.12 kg 的 CO2(参见ML CO2 Impact calculator)。与参数量约 0.13B 的专用模型相比,运行像 GPT4 这样(据称)具有 8x220B 参数的通用 LLM 效率低得离谱。
结论
我们已经展示了使用 LLM 创建合成数据来训练更小、更高效模型的巨大优势。虽然此示例仅涉及投资者情绪分类,但同样的流程可应用于许多其他任务,从其他分类任务(例如客户意图检测或有害内容检测),到 token 分类(例如命名实体识别或 PII 检测),再到生成任务(例如摘要或问答)。
在 2024 年,企业比以往任何时候都更容易创建自己的高效模型、掌控自己的数据和基础设施、减少 CO2 排放,并在不牺牲准确性的情况下节省计算成本和时间。
现在,自己试试吧!你可以在复现仓库中找到本博客文章中所有数字的完整复现代码,以及更高效的批处理异步 API 调用函数。我们邀请你将我们的代码复制并适配到你的用例中!
来源:Hugging Face Blog · hf-mirror.com