Transformers 4.37 中文文档(二)(1)https://developer.aliyun.com/article/1563278
以 8 位或 4 位加载
bitsandbytes
集成支持 8 位和 4 位精度数据类型,对于加载大型模型很有用,因为它节省内存(请参阅bitsandbytes
集成指南以了解更多)。将load_in_8bit
或load_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 微调模型,请查看微调预训练模型教程。
- 使用任务类型和超参数定义您的适配器配置(有关超参数的详细信息,请参阅
~peft.LoraConfig
)。
from peft import LoraConfig peft_config = LoraConfig( lora_alpha=16, lora_dropout=0.1, r=64, bias="none", task_type="CAUSAL_LM", )
- 将适配器添加到模型中。
model.add_adapter(peft_config)
- 现在您可以将模型传递给 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)
您的浏览器不支持音频元素。 |
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