Transformers 4.37 中文文档(八)(3)

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

Transformers 4.37 中文文档(八)(2)https://developer.aliyun.com/article/1563209


故障排除

原文链接:huggingface.co/docs/transformers/v4.37.2/en/troubleshooting

有时会出现错误,但我们在这里帮助您!本指南涵盖了我们见过的一些最常见问题以及您可以如何解决它们。但是,本指南并不旨在成为每个🤗 Transformers 问题的全面集合。如需更多有关故障排除的帮助,请尝试:

www.youtube-nocookie.com/embed/S2EEG3JIt2A

  1. 论坛上寻求帮助。您可以将问题发布到特定类别,如初学者🤗 Transformers。请确保编写一个具有一些可重现代码的良好描述性论坛帖子,以最大程度地提高解决问题的可能性!

www.youtube-nocookie.com/embed/_PAli-V4wj0

  1. 如果是与库相关的错误,请在🤗 Transformers 存储库上创建一个Issue。尽量包含尽可能多描述错误的信息,以帮助我们更好地找出问题所在以及如何修复它。
  2. 如果您使用较旧版本的🤗 Transformers,请查看迁移指南,因为在版本之间引入了一些重要更改。

有关故障排除和获取帮助的更多详细信息,请查看 Hugging Face 课程的第八章

防火墙环境

一些云端和内部设置的 GPU 实例被防火墙阻止对外部连接,导致连接错误。当您的脚本尝试下载模型权重或数据集时,下载将挂起,然后超时并显示以下消息:

ValueError: Connection error, and we cannot find the requested files in the cached path.
Please try again or make sure your Internet connection is on.

在这种情况下,您应该尝试在离线模式下运行🤗 Transformers 以避免连接错误。

CUDA 内存不足

在没有适当硬件的情况下训练拥有数百万参数的大型模型可能会很具挑战性。当 GPU 内存不足时,您可能会遇到的常见错误是:

CUDA out of memory. Tried to allocate 256.00 MiB (GPU 0; 11.17 GiB total capacity; 9.70 GiB already allocated; 179.81 MiB free; 9.85 GiB reserved in total by PyTorch)

以下是一些潜在的解决方案,您可以尝试减少内存使用:

  • 减少 TrainingArguments 中的per_device_train_batch_size值。
  • 尝试在 TrainingArguments 中使用gradient_accumulation_steps来有效增加总体批量大小。

有关节省内存技术的更多详细信息,请参考性能指南。

无法加载保存的 TensorFlow 模型

TensorFlow 的model.save方法将整个模型(架构、权重、训练配置)保存在单个文件中。然而,当您再次加载模型文件时,可能会遇到错误,因为🤗  Transformers 可能不会加载模型文件中的所有与 TensorFlow 相关的对象。为避免保存和加载 TensorFlow  模型时出现问题,我们建议您:

  • 使用model.save_weights将模型权重保存为h5文件扩展名,然后使用 from_pretrained()重新加载模型:
>>> from transformers import TFPreTrainedModel
>>> from tensorflow import keras
>>> model.save_weights("some_folder/tf_model.h5")
>>> model = TFPreTrainedModel.from_pretrained("some_folder")
  • 使用~TFPretrainedModel.save_pretrained保存模型,然后使用 from_pretrained()再次加载它:
>>> from transformers import TFPreTrainedModel
>>> model.save_pretrained("path_to/model")
>>> model = TFPreTrainedModel.from_pretrained("path_to/model")

ImportError

您可能会遇到另一种常见错误,特别是对于新发布的模型,即ImportError

ImportError: cannot import name 'ImageGPTImageProcessor' from 'transformers' (unknown location)

对于这些错误类型,请确保您已安装了最新版本的🤗 Transformers 以访问最新的模型:

pip install transformers --upgrade

CUDA error: device-side assert triggered

有时您可能会遇到有关设备代码错误的通用 CUDA 错误。

RuntimeError: CUDA error: device-side assert triggered

您应该首先尝试在 CPU 上运行代码,以获得更详细的错误消息。将以下环境变量添加到您的代码开头以切换到 CPU:

>>> import os
>>> os.environ["CUDA_VISIBLE_DEVICES"] = ""

另一个选项是从 GPU 获取更好的回溯。将以下环境变量添加到您的代码开头,以使回溯指向错误源:

>>> import os
>>> os.environ["CUDA_LAUNCH_BLOCKING"] = "1"

当填充标记未被屏蔽时输出不正确

在某些情况下,如果input_ids包含填充标记,则输出的hidden_state可能是不正确的。为了演示,加载一个模型和分词器。您可以访问模型的pad_token_id以查看其值。对于一些模型,pad_token_id可能为None,但您总是可以手动设置它。

>>> from transformers import AutoModelForSequenceClassification
>>> import torch
>>> model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
>>> model.config.pad_token_id
0

以下示例显示了不屏蔽填充标记时的输出:

>>> input_ids = torch.tensor([[7592, 2057, 2097, 2393, 9611, 2115], [7592, 0, 0, 0, 0, 0]])
>>> output = model(input_ids)
>>> print(output.logits)
tensor([[ 0.0082, -0.2307],
        [ 0.1317, -0.1683]], grad_fn=<AddmmBackward0>)

以下是第二个序列的实际输出:

>>> input_ids = torch.tensor([[7592]])
>>> output = model(input_ids)
>>> print(output.logits)
tensor([[-0.1008, -0.4061]], grad_fn=<AddmmBackward0>)

大多数情况下,您应该为您的模型提供一个attention_mask来忽略填充标记,以避免这种潜在错误。现在第二个序列的输出与其实际输出匹配:

默认情况下,分词器根据特定分词器的默认值为您创建attention_mask

>>> attention_mask = torch.tensor([[1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0]])
>>> output = model(input_ids, attention_mask=attention_mask)
>>> print(output.logits)
tensor([[ 0.0082, -0.2307],
        [-0.1008, -0.4061]], grad_fn=<AddmmBackward0>)

🤗 Transformers 不会自动创建attention_mask来屏蔽填充标记,如果提供了填充标记,因为:

  • 一些模型没有填充标记。
  • 对于某些用例,用户希望模型关注填充标记。

ValueError: Unrecognized configuration class XYZ for this kind of AutoModel

通常,我们建议使用 AutoModel 类来加载预训练模型的实例。这个类可以根据配置自动推断和加载给定检查点中的正确架构。如果在从检查点加载模型时看到ValueError,这意味着 Auto 类无法从给定检查点中的配置找到到您尝试加载的模型类型的映射。最常见的情况是,当检查点不支持给定任务时会发生这种情况。例如,在以下示例中,您将看到此错误,因为没有用于问答的 GPT2:

>>> from transformers import AutoProcessor, AutoModelForQuestionAnswering
>>> processor = AutoProcessor.from_pretrained("gpt2-medium")
>>> model = AutoModelForQuestionAnswering.from_pretrained("gpt2-medium")
ValueError: Unrecognized configuration class <class 'transformers.models.gpt2.configuration_gpt2.GPT2Config'> for this kind of AutoModel: AutoModelForQuestionAnswering.
Model type should be one of AlbertConfig, BartConfig, BertConfig, BigBirdConfig, BigBirdPegasusConfig, BloomConfig, ...

性能和可伸缩性

性能和可伸缩性

原文链接:huggingface.co/docs/transformers/v4.37.2/en/performance

训练大型 Transformer 模型并将其部署到生产环境中会带来各种挑战。

在训练过程中,模型可能需要比可用 GPU 内存更多的 GPU 内存,或者表现出训练速度较慢。在部署阶段,模型可能难以处理生产环境中所需的吞吐量。

本文档旨在帮助您克服这些挑战,并找到适合您用例的最佳设置。指南分为训练和推理部分,因为每个部分都有不同的挑战和解决方案。在每个部分中,您将找到针对不同硬件配置的单独指南,例如单个 GPU 与多个 GPU 进行训练,或 CPU 与 GPU 进行推理。

将本文档作为您进一步导航到与您的情况匹配的方法的起点。

训练

训练大型 Transformer 模型高效地需要像 GPU 或 TPU 这样的加速器。最常见的情况是你只有一块  GPU。您可以应用的方法来提高单个 GPU 上的训练效率也适用于其他设置,如多个 GPU。然而,也有一些特定于多 GPU 或 CPU  训练的技术。我们在单独的部分中进行介绍。

  • 在单个 GPU 上进行高效训练的方法和工具:从这里开始学习可以帮助优化 GPU 内存利用率、加快训练速度或两者兼具的常见方法。
  • 多 GPU 训练部分:探索本节,了解适用于多 GPU 设置的进一步优化方法,如数据、张量和管道并行。
  • CPU 训练部分:了解在 CPU 上进行混合精度训练。
  • 在多个 CPU 上进行高效训练:了解分布式 CPU 训练。
  • 使用 TensorFlow 在 TPU 上训练:如果您是 TPU 的新手,请参考本节,了解在 TPU 上训练和使用 XLA 的主观介绍。
  • 用于训练的自定义硬件:在构建自己的深度学习装置时找到技巧和窍门。
  • 使用 Trainer API 进行超参数搜索

推理

在生产环境中使用大型模型进行高效推理可能与训练它们一样具有挑战性。在接下来的部分中,我们将介绍在 CPU 和单/多 GPU 设置上运行推理的步骤。

  • 在单个 CPU 上进行推理
  • 在单个 GPU 上进行推理
  • 多 GPU 推理
  • XLA 集成用于 TensorFlow 模型

训练和推理

在这里,您将找到适用于训练模型或使用模型进行推理的技术、提示和技巧。

  • 实例化一个大模型
  • 性能问题的故障排除

贡献

这份文档远未完整,还有很多需要添加的内容,所以如果您有补充或更正,请不要犹豫,打开一个 PR,或者如果您不确定,请开始一个 Issue,我们可以在那里讨论细节。

在提出 A 优于 B 的贡献时,请尽量包含可重现的基准测试和/或指向该信息来源的链接(除非信息直接来自您)。

量化

原文链接:huggingface.co/docs/transformers/v4.37.2/en/quantization

量化技术专注于用更少的信息表示数据,同时也试图不丢失太多准确性。这通常意味着将数据类型转换为用更少的位表示相同信息。例如,如果您的模型权重存储为  32 位浮点数,并且它们被量化为 16  位浮点数,这将使模型大小减半,使其更容易存储并减少内存使用。较低的精度也可以加快推理速度,因为使用更少的位进行计算需要更少的时间。

Transformers 支持几种量化方案,帮助您在大型语言模型(LLMs)上运行推理和在量化模型上微调适配器。本指南将向您展示如何使用激活感知权重量化(AWQ)、AutoGPTQ 和 bitsandbytes。

AWQ

尝试使用这个notebook进行 AWQ 量化!

激活感知权重量化(AWQ)不会量化模型中的所有权重,而是保留对 LLM 性能重要的一小部分权重。这显著减少了量化损失,使您可以在不经历任何性能降级的情况下以 4 位精度运行模型。

有几个库可用于使用 AWQ 算法量化模型,例如llm-awqautoawqoptimum-intel。 Transformers 支持加载使用 llm-awq 和 autoawq 库量化的模型。本指南将向您展示如何加载使用 autoawq 量化的模型,但对于使用 llm-awq 量化的模型,过程类似。

确保您已安装 autoawq:

pip install autoawq

可以通过检查模型的config.json文件中的quantization_config属性来识别 AWQ 量化模型:

{
  "_name_or_path": "/workspace/process/huggingfaceh4_zephyr-7b-alpha/source",
  "architectures": [
    "MistralForCausalLM"
  ],
  ...
  ...
  ...
  "quantization_config": {
    "quant_method": "awq",
    "zero_point": true,
    "group_size": 128,
    "bits": 4,
    "version": "gemm"
  }
}

使用 from_pretrained()方法加载量化模型。如果您在 CPU 上加载了模型,请确保首先将其移动到 GPU 设备上。使用device_map参数指定模型放置的位置:

from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "TheBloke/zephyr-7B-alpha-AWQ"
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="cuda:0")

加载 AWQ 量化模型会自动将其他权重默认设置为 fp16 以提高性能。如果您想以不同格式加载这些其他权重,请使用torch_dtype参数:

from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "TheBloke/zephyr-7B-alpha-AWQ"
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float32)

AWQ 量化也可以与 FlashAttention-2 结合,以进一步加速推理:

from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("TheBloke/zephyr-7B-alpha-AWQ", attn_implementation="flash_attention_2", device_map="cuda:0")

融合模块

融合模块提供了改进的准确性和性能,并且对于LlamaMistral架构的 AWQ 模块支持开箱即用,但您也可以为不支持的架构融合 AWQ 模块。

融合模块不能与 FlashAttention-2 等其他优化技术结合使用。

支持的架构不支持的架构

要为支持的架构启用融合模块,请创建一个 AwqConfig 并设置参数fuse_max_seq_lendo_fuse=Truefuse_max_seq_len参数是总序列长度,应包括上下文长度和预期生成长度。您可以将其设置为较大的值以确保安全。

例如,要融合TheBloke/Mistral-7B-OpenOrca-AWQ模型的 AWQ 模块。

import torch
from transformers import AwqConfig, AutoModelForCausalLM
model_id = "TheBloke/Mistral-7B-OpenOrca-AWQ"
quantization_config = AwqConfig(
    bits=4,
    fuse_max_seq_len=512,
    do_fuse=True,
)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config).to(0)

AutoGPTQ

在这个notebook中尝试使用 PEFT 进行 GPTQ 量化,并在这篇博客文章中了解更多细节!

AutoGPTQ库实现了 GPTQ  算法,这是一种后训练量化技术,其中权重矩阵的每一行都独立量化,以找到最小化误差的权重版本。这些权重被量化为 int4,但在推理过程中会动态恢复为  fp16。这可以通过 4 倍减少内存使用,因为 int4 权重在融合内核中而不是 GPU  的全局内存中被解量化,您还可以期望推理速度提升,因为使用较低的位宽需要更少的通信时间。

开始之前,请确保安装了以下库:

pip install auto-gptq
pip install git+https://github.com/huggingface/optimum.git
pip install git+https://github.com/huggingface/transformers.git
pip install --upgrade accelerate

要量化一个模型(目前仅支持文本模型),您需要创建一个 GPTQConfig 类,并设置要量化的位数、用于校准权重的数据集以及准备数据集的分词器。

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
gptq_config = GPTQConfig(bits=4, dataset="c4", tokenizer=tokenizer)

您还可以将自己的数据集作为字符串列表传递,但强烈建议使用 GPTQ 论文中相同的数据集。

dataset = ["auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."]
gptq_config = GPTQConfig(bits=4, dataset=dataset, tokenizer=tokenizer)

加载一个要量化的模型,并将gptq_config传递给 from_pretrained()方法。设置device_map="auto"以自动将模型卸载到 CPU,以帮助将模型适配到内存中,并允许模型模块在 CPU 和 GPU 之间移动以进行量化。

quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=gptq_config)

如果由于数据集过大而导致内存不足,不支持磁盘卸载。如果是这种情况,请尝试传递max_memory参数来分配设备(GPU 和 CPU)上要使用的内存量:

quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", max_memory={0: "30GiB", 1: "46GiB", "cpu": "30GiB"}, quantization_config=gptq_config)

根据您的硬件,从头开始量化一个模型可能需要一些时间。在免费的 Google Colab GPU 上,量化  faceboook/opt-350m 模型可能需要约 5 分钟,但在 NVIDIA A100 上,量化一个 175B 参数模型可能需要约 4  小时。在量化模型之前,最好先检查 Hub,看看模型的 GPTQ 量化版本是否已经存在。

一旦您的模型被量化,您可以将模型和分词器推送到 Hub,这样可以轻松共享和访问。使用 push_to_hub()方法保存 GPTQConfig:

quantized_model.push_to_hub("opt-125m-gptq")
tokenizer.push_to_hub("opt-125m-gptq")

您还可以使用 save_pretrained()方法将您的量化模型保存在本地。如果模型是使用device_map参数量化的,请确保在保存之前将整个模型移动到 GPU 或 CPU。例如,要在 CPU 上保存模型:

quantized_model.save_pretrained("opt-125m-gptq")
tokenizer.save_pretrained("opt-125m-gptq")
# if quantized with device_map set
quantized_model.to("cpu")
quantized_model.save_pretrained("opt-125m-gptq")

使用 from_pretrained()方法重新加载一个量化模型,并设置device_map="auto"以自动将模型分布在所有可用的 GPU 上,以便更快地加载模型而不使用比所需更多的内存。

from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto")

ExLlama

ExLlama是 Llama 模型的 Python/C++/CUDA 实现,旨在通过 4 位 GPTQ 权重实现更快的推理(查看这些基准测试)。当您创建一个 GPTQConfig 对象时,默认情况下会激活 ExLlama 内核。为了进一步提高推理速度,请配置exllama_config参数使用ExLlamaV2内核:

import torch
from transformers import AutoModelForCausalLM, GPTQConfig
gptq_config = GPTQConfig(bits=4, exllama_config={"version":2})
model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto", quantization_config=gptq_config)

仅支持 4 位模型,并且我们建议在对量化模型进行微调时停用 ExLlama 内核。

只有当整个模型在 GPU 上时才支持 ExLlama 内核。如果您在 CPU 上使用 AutoGPTQ(版本>0.4.2)进行推理,则需要禁用 ExLlama 内核。这将覆盖 config.json 文件中与 ExLlama 内核相关的属性。

import torch
from transformers import AutoModelForCausalLM, GPTQConfig
gptq_config = GPTQConfig(bits=4, use_exllama=False)
model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="cpu", quantization_config=gptq_config)


Transformers 4.37 中文文档(八)(4)https://developer.aliyun.com/article/1563211

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
3月前
|
数据可视化 自动驾驶 机器人
Transformers 4.37 中文文档(五)(4)
Transformers 4.37 中文文档(五)
36 0
|
3月前
|
数据可视化 PyTorch TensorFlow
Transformers 4.37 中文文档(四)(4)
Transformers 4.37 中文文档(四)
28 1
Transformers 4.37 中文文档(四)(4)
|
3月前
|
存储 编解码 JSON
Transformers 4.37 中文文档(四)(5)
Transformers 4.37 中文文档(四)
43 1
Transformers 4.37 中文文档(四)(5)
|
3月前
|
自然语言处理 PyTorch TensorFlow
Transformers 4.37 中文文档(一百)(6)
Transformers 4.37 中文文档(一百)
30 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 中文文档(二)(3)
Transformers 4.37 中文文档(二)
44 2
|
3月前
|
存储 自然语言处理 测试技术
Transformers 4.37 中文文档(八)(1)
Transformers 4.37 中文文档(八)
25 2
|
3月前
|
存储 自然语言处理 测试技术
Transformers 4.37 中文文档(八)(4)
Transformers 4.37 中文文档(八)
59 2
|
3月前
|
API 计算机视觉 Python
Transformers 4.37 中文文档(八)(2)
Transformers 4.37 中文文档(八)
50 2