Transformers 4.37 中文文档(二)(2)

简介: Transformers 4.37 中文文档(二)

Transformers 4.37 中文文档(二)(1)https://developer.aliyun.com/article/1563278


以 8 位或 4 位加载

bitsandbytes集成支持 8 位和 4 位精度数据类型,对于加载大型模型很有用,因为它节省内存(请参阅bitsandbytes集成指南以了解更多)。将load_in_8bitload_in_4bit参数添加到 from_pretrained()中,并设置device_map="auto"以有效地将模型分配到您的硬件:

from transformers import AutoModelForCausalLM, AutoTokenizer
peft_model_id = "ybelkada/opt-350m-lora"
model = AutoModelForCausalLM.from_pretrained(peft_model_id, device_map="auto", load_in_8bit=True)

添加一个新适配器

您可以使用~peft.PeftModel.add_adapter将一个新适配器添加到具有现有适配器的模型中,只要新适配器与当前适配器的类型相同。例如,如果您有一个已经连接到模型的现有 LoRA 适配器:

from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
from peft import LoraConfig
model_id = "facebook/opt-350m"
model = AutoModelForCausalLM.from_pretrained(model_id)
lora_config = LoraConfig(
    target_modules=["q_proj", "k_proj"],
    init_lora_weights=False
)
model.add_adapter(lora_config, adapter_name="adapter_1")

添加一个新适配器:

# attach new adapter with same config
model.add_adapter(lora_config, adapter_name="adapter_2")

现在您可以使用~peft.PeftModel.set_adapter来设置要使用的适配器:

# use adapter_1
model.set_adapter("adapter_1")
output = model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))
# use adapter_2
model.set_adapter("adapter_2")
output_enabled = model.generate(**inputs)
print(tokenizer.decode(output_enabled[0], skip_special_tokens=True))

启用和禁用适配器

一旦您向模型添加了适配器,您可以启用或禁用适配器模块。要启用适配器模块:

from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
from peft import PeftConfig
model_id = "facebook/opt-350m"
adapter_model_id = "ybelkada/opt-350m-lora"
tokenizer = AutoTokenizer.from_pretrained(model_id)
text = "Hello"
inputs = tokenizer(text, return_tensors="pt")
model = AutoModelForCausalLM.from_pretrained(model_id)
peft_config = PeftConfig.from_pretrained(adapter_model_id)
# to initiate with random weights
peft_config.init_lora_weights = False
model.add_adapter(peft_config)
model.enable_adapters()
output = model.generate(**inputs)

要禁用适配器模块:

model.disable_adapters()
output = model.generate(**inputs)

训练一个 PEFT 适配器

PEFT 适配器受 Trainer 类支持,因此您可以为特定用例训练一个适配器。只需要添加几行代码。例如,要训练一个 LoRA 适配器:

如果您不熟悉使用 Trainer 微调模型,请查看微调预训练模型教程。

  1. 使用任务类型和超参数定义您的适配器配置(有关超参数的详细信息,请参阅~peft.LoraConfig)。
from peft import LoraConfig
peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
)
  1. 将适配器添加到模型中。
model.add_adapter(peft_config)
  1. 现在您可以将模型传递给 Trainer!
trainer = Trainer(model=model, ...)
trainer.train()

保存您训练过的适配器并加载回来:

model.save_pretrained(save_dir)
model = AutoModelForCausalLM.from_pretrained(save_dir)

向 PEFT 适配器添加额外的可训练层

您还可以通过在 PEFT 配置中传递modules_to_save来在已附加适配器的模型顶部微调额外的可训练适配器。例如,如果您想在具有 LoRA 适配器的模型顶部也微调 lm_head:

from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
from peft import LoraConfig
model_id = "facebook/opt-350m"
model = AutoModelForCausalLM.from_pretrained(model_id)
lora_config = LoraConfig(
    target_modules=["q_proj", "k_proj"],
    modules_to_save=["lm_head"],
)
model.add_adapter(lora_config)

分享模型

原始文本:huggingface.co/docs/transformers/v4.37.2/en/model_sharing

最后两个教程展示了如何使用 PyTorch、Keras 和🤗加速进行分布式设置对模型进行微调。下一步是与社区分享您的模型!在  Hugging Face,我们相信公开分享知识和资源,以使人人都能民主化人工智能。我们鼓励您考虑与社区分享您的模型,以帮助他人节省时间和资源。

在本教程中,您将学习两种在模型中心上分享经过训练或微调模型的方法:

  • 通过程序将文件推送到 Hub。
  • 通过 Web 界面将文件拖放到 Hub 中。

www.youtube.com/embed/XvSGPZFEjDY

要与社区分享模型,您需要在huggingface.co上拥有一个帐户。您还可以加入现有组织或创建一个新组织。

存储库功能

模型中心上的每个存储库的行为类似于典型的 GitHub 存储库。我们的存储库提供版本控制、提交历史记录和可视化差异的功能。

模型中心内置的版本控制基于 git 和git-lfs。换句话说,您可以将一个模型视为一个存储库,实现更大的访问控制和可扩展性。版本控制允许修订,这是通过提交哈希、标签或分支固定模型的特定版本的方法。

因此,您可以使用revision参数加载特定模型版本:

>>> model = AutoModel.from_pretrained(
...     "julien-c/EsperBERTo-small", revision="v2.0.1"  # tag name, or branch name, or commit hash
... )

文件也可以在存储库中轻松编辑,您还可以查看提交历史记录以及差异:

设置

在将模型分享到 Hub 之前,您将需要您的 Hugging Face 凭据。如果您可以访问终端,请在安装🤗 Transformers 的虚拟环境中运行以下命令。这将在您的 Hugging Face 缓存文件夹(默认为~/.cache/)中存储您的访问令牌:

huggingface-cli login

如果您正在使用 Jupyter 或 Colaboratory 等笔记本,请确保已安装huggingface_hub库。该库允许您以编程方式与 Hub 进行交互。

pip install huggingface_hub

然后使用notebook_login登录到 Hub,并按照链接此处生成一个令牌以登录:

>>> from huggingface_hub import notebook_login
>>> notebook_login()

将模型转换为所有框架

为确保您的模型可以被使用不同框架的人使用,我们建议您将您的模型转换并上传为 PyTorch 和 TensorFlow 检查点。虽然用户仍然可以从不同框架加载您的模型,如果您跳过此步骤,加载速度会较慢,因为🤗 Transformers 需要即时转换检查点。

将另一个框架的检查点转换为另一个框架很容易。确保您已安装 PyTorch 和 TensorFlow(请参阅此处获取安装说明),然后在另一个框架中找到适合您任务的特定模型。

Pytorch 隐藏 Pytorch 内容

指定from_tf=True以将 TensorFlow 的检查点转换为 PyTorch:

>>> pt_model = DistilBertForSequenceClassification.from_pretrained("path/to/awesome-name-you-picked", from_tf=True)
>>> pt_model.save_pretrained("path/to/awesome-name-you-picked")

TensorFlow 隐藏 TensorFlow 内容

指定from_pt=True以将 PyTorch 的检查点转换为 TensorFlow:

>>> tf_model = TFDistilBertForSequenceClassification.from_pretrained("path/to/awesome-name-you-picked", from_pt=True)

然后,您可以使用新的检查点保存您的新 TensorFlow 模型:

>>> tf_model.save_pretrained("path/to/awesome-name-you-picked")

JAX 隐藏 JAX 内容

如果一个模型在 Flax 中可用,您也可以将 PyTorch 的检查点转换为 Flax:

>>> flax_model = FlaxDistilBertForSequenceClassification.from_pretrained(
...     "path/to/awesome-name-you-picked", from_pt=True
... )

在训练期间推送模型

Pytorch 隐藏 Pytorch 内容

www.youtube-nocookie.com/embed/Z1-XMy-GNLQ

将模型共享到 Hub 就像添加一个额外的参数或回调一样简单。请记住来自微调教程中,TrainingArguments  类是您指定超参数和额外训练选项的地方。其中一个训练选项包括直接将模型推送到 Hub 的能力。在您的 TrainingArguments 中设置push_to_hub=True

>>> training_args = TrainingArguments(output_dir="my-awesome-model", push_to_hub=True)

像往常一样将您的训练参数传递给 Trainer:

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     train_dataset=small_train_dataset,
...     eval_dataset=small_eval_dataset,
...     compute_metrics=compute_metrics,
... )

在微调您的模型后,调用 push_to_hub()在 Trainer 上将训练好的模型推送到 Hub。🤗 Transformers 甚至会自动将训练超参数、训练结果和框架版本添加到您的模型卡中!

>>> trainer.push_to_hub()

TensorFlow 隐藏 TensorFlow 内容

使用 PushToHubCallback 将模型共享到 Hub。在 PushToHubCallback 函数中,添加:

  • 一个用于您的模型的输出目录。
  • 一个分词器。
  • hub_model_id,即您的 Hub 用户名和模型名称。
>>> from transformers import PushToHubCallback
>>> push_to_hub_callback = PushToHubCallback(
...     output_dir="./your_model_save_path", tokenizer=tokenizer, hub_model_id="your-username/my-awesome-model"
... )

将回调添加到fit,🤗 Transformers 将推送训练好的模型到 Hub:

>>> model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3, callbacks=push_to_hub_callback)

使用push_to_hub函数

您还可以直接在您的模型上调用push_to_hub来将其上传到 Hub。

push_to_hub中指定您的模型名称:

>>> pt_model.push_to_hub("my-awesome-model")

这将在您的用户名下创建一个名为my-awesome-model的模型存储库。用户现在可以使用from_pretrained函数加载您的模型:

>>> from transformers import AutoModel
>>> model = AutoModel.from_pretrained("your_username/my-awesome-model")

如果您属于一个组织,并希望将您的模型推送到组织名称下,只需将其添加到repo_id中:

>>> pt_model.push_to_hub("my-awesome-org/my-awesome-model")

push_to_hub函数也可以用于向模型存储库添加其他文件。例如,向模型存储库添加一个分词器:

>>> tokenizer.push_to_hub("my-awesome-model")

或者您可能想要添加您微调的 PyTorch 模型的 TensorFlow 版本:

>>> tf_model.push_to_hub("my-awesome-model")

现在当您导航到您的 Hugging Face 个人资料时,您应该看到您新创建的模型存储库。点击文件选项卡将显示您上传到存储库的所有文件。

有关如何创建和上传文件到存储库的更多详细信息,请参考 Hub 文档这里

使用 Web 界面上传

喜欢无代码方法的用户可以通过 Hub 的 Web 界面上传模型。访问huggingface.co/new创建一个新存储库:

在这里,添加有关您的模型的一些信息:

  • 选择存储库的所有者。这可以是您自己或您所属的任何组织。
  • 为您的模型选择一个名称,这也将是存储库名称。
  • 选择您的模型是公开的还是私有的。
  • 为您的模型指定许可证使用情况。

现在点击文件选项卡,然后点击添加文件按钮将新文件上传到您的存储库。然后拖放文件进行上传并添加提交消息。

添加一个模型卡

为确保用户了解您的模型的功能、限制、潜在偏见和道德考虑,请向您的存储库添加一个模型卡。模型卡在README.md文件中定义。您可以通过以下方式添加模型卡:

  • 手动创建和上传README.md文件。
  • 点击您的模型存储库中的编辑模型卡按钮。

查看 DistilBert 的模型卡片,这是模型卡片应包含的信息类型的一个很好的例子。有关您可以在README.md文件中控制的其他选项的更多详细信息,例如模型的碳足迹或小部件示例,请参考此处的文档

Transformers Agents

原始文本:huggingface.co/docs/transformers/v4.37.2/en/transformers_agents

Transformers Agents 是一个实验性 API,随时可能会发生变化。由代理返回的结果可能会有所不同,因为 API 或基础模型容易发生变化。

Transformers 版本 v4.29.0,构建在工具代理的概念之上。您可以在此 colab中进行操作。

简而言之,它提供了一个自然语言 API,基于 transformers:我们定义了一组精心策划的工具,并设计了一个代理来解释自然语言并使用这些工具。它是可扩展的设计;我们策划了一些相关工具,但我们将向您展示系统如何轻松扩展以使用社区开发的任何工具。

让我们从几个示例开始,展示这个新 API 可以实现的功能。当涉及多模态任务时,它特别强大,因此让我们试一试生成图像并大声朗读文本。

agent.run("Caption the following image", image=image)
输入 输出
一只海狸正在水中游泳

agent.run("Read the following text out loud", text=text)

https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tts_example.wav

您的浏览器不支持音频元素。 |


agent.run(
    "In the following `document`, where will the TRRF Scientific Advisory Council Meeting take place?",
    document=document,
)
输入 输出


舞厅门厅

快速开始

在能够使用agent.run之前,您需要实例化一个代理,这是一个大型语言模型(LLM)。我们支持 openAI  模型以及来自 BigCode 和 OpenAssistant 的开源替代方案。openAI 模型表现更好(但需要您拥有 openAI API  密钥,因此不能免费使用);Hugging Face 为 BigCode 和 OpenAssistant 模型提供免费访问端点。

首先,请安装agents额外组件以安装所有默认依赖项。

pip install transformers[agents]

要使用 openAI 模型,您需要在安装openai依赖项后实例化 OpenAiAgent:

pip install openai
from transformers import OpenAiAgent
agent = OpenAiAgent(model="text-davinci-003", api_key="<your_api_key>")

要使用 BigCode 或 OpenAssistant,请先登录以访问推理 API:

from huggingface_hub import login
login("<YOUR_TOKEN>")

然后,实例化代理

from transformers import HfAgent
# Starcoder
agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")
# StarcoderBase
# agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoderbase")
# OpenAssistant
# agent = HfAgent(url_endpoint="https://api-inference.huggingface.co/models/OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5")

这是目前 Hugging Face 免费提供的推理 API。如果您有自己的推理端点用于此模型(或其他模型),可以用您的 URL 端点替换上面的 URL。

StarCoder 和 OpenAssistant 是免费使用的,并在简单任务上表现出色。但是,在处理更复杂的提示时,检查点无法保持。如果您遇到此类问题,我们建议尝试 OpenAI 模型,尽管遗憾的是,它不是开源的,但在当前时间表现更好。

现在您可以开始了!让我们深入了解您现在可以使用的两个 API。

单次执行(运行)

单次执行方法是使用代理的 run()方法:

agent.run("Draw me a picture of rivers and lakes.")

它会自动选择适合您要执行的任务的工具(或工具),并适当运行它们。它可以在同一指令中执行一个或多个任务(尽管您的指令越复杂,代理失败的可能性就越大)。

agent.run("Draw me a picture of the sea then transform the picture to add an island")

每个 run()操作都是独立的,因此您可以连续运行多次,执行不同的任务。

请注意,您的代理只是一个大型语言模型,因此提示中的细微变化可能会产生完全不同的结果。尽可能清楚地解释您想要执行的任务是很重要的。我们在这里更深入地讨论如何编写良好的提示这里。

如果您想在执行过程中保持状态或向代理传递非文本对象,可以通过指定您希望代理使用的变量来实现。例如,您可以生成河流和湖泊的第一幅图像,并要求模型更新该图片以添加一个岛屿,方法如下:

picture = agent.run("Generate a picture of rivers and lakes.")
updated_picture = agent.run("Transform the image in `picture` to add an island to it.", picture=picture)

当模型无法理解您的请求并混合工具时,这可能会有所帮助。一个例子是:

agent.run("Draw me the picture of a capybara swimming in the sea")

在这里,模型可以以两种方式解释:

  • text-to-image生成一只在海里游泳的水豚
  • 或者,让text-to-image生成水豚,然后使用image-transformation工具让它在海里游泳

如果您想强制执行第一个场景,可以通过将提示作为参数传递给它来实现:

agent.run("Draw me a picture of the `prompt`", prompt="a capybara swimming in the sea")


Transformers 4.37 中文文档(二)(3)https://developer.aliyun.com/article/1563284

相关文章
|
3月前
|
数据可视化 PyTorch 测试技术
Transformers 4.37 中文文档(五)(6)
Transformers 4.37 中文文档(五)
53 1
|
3月前
|
数据可视化 自动驾驶 机器人
Transformers 4.37 中文文档(五)(4)
Transformers 4.37 中文文档(五)
36 0
|
3月前
|
存储 缓存 Shell
Transformers 4.37 中文文档(一)(3)
Transformers 4.37 中文文档(一)
212 1
Transformers 4.37 中文文档(一)(3)
|
3月前
|
存储 编解码 JSON
Transformers 4.37 中文文档(四)(5)
Transformers 4.37 中文文档(四)
43 1
Transformers 4.37 中文文档(四)(5)
|
3月前
|
数据可视化 PyTorch TensorFlow
Transformers 4.37 中文文档(四)(4)
Transformers 4.37 中文文档(四)
28 1
Transformers 4.37 中文文档(四)(4)
|
3月前
|
PyTorch TensorFlow 调度
Transformers 4.37 中文文档(一)(5)
Transformers 4.37 中文文档(一)
57 1
|
3月前
|
自然语言处理 安全 PyTorch
Transformers 4.37 中文文档(一)(4)
Transformers 4.37 中文文档(一)
42 1
|
3月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一百)(4)
Transformers 4.37 中文文档(一百)
37 1
|
3月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一百)(5)
Transformers 4.37 中文文档(一百)
28 1
|
3月前
|
编解码 缓存 算法
Transformers 4.37 中文文档(一百)(2)
Transformers 4.37 中文文档(一百)
33 1