GaudiTrainer
该 GaudiTrainer
类为功能完备的 Transformers Trainer 提供了扩展的 API。它用于所有 示例脚本。
在实例化您的 GaudiTrainer
之前,创建一个 GaudiTrainingArguments 对象以在训练期间访问所有自定义点。
该 GaudiTrainer
类针对在 Habana Gaudi 上运行的 🤗 Transformers 模型进行了优化。
以下是如何自定义 GaudiTrainer
以使用加权损失(当您拥有不平衡的训练集时很有用)的示例
from torch import nn
from optimum.habana import GaudiTrainer
class CustomGaudiTrainer(GaudiTrainer):
def compute_loss(self, model, inputs, return_outputs=False):
labels = inputs.get("labels")
# forward pass
outputs = model(**inputs)
logits = outputs.get("logits")
# compute custom loss (suppose one has 3 labels with different weights)
loss_fct = nn.CrossEntropyLoss(weight=torch.tensor([1.0, 2.0, 3.0]))
loss = loss_fct(logits.view(-1, self.model.config.num_labels), labels.view(-1))
return (loss, outputs) if return_outputs else loss
自定义 PyTorch GaudiTrainer
的训练循环行为的另一种方法是使用 回调,这些回调可以检查训练循环状态(用于进度报告、在 TensorBoard 或其他机器学习平台上记录……)并做出决策(例如提前停止)。
GaudiTrainer
类 optimum.habana.GaudiTrainer
< 源代码 >( 模型: Union = None gaudi_config: GaudiConfig = None 参数: TrainingArguments = None 数据整理器: Optional = None 训练数据集: Union = None 评估数据集: Union = None 分词器: Optional = None 模型初始化: Optional = None 计算指标: Optional = None 回调: Optional = None 优化器: Tuple = (None, None) 预处理指标的logits: Optional = None )
GaudiTrainer 构建在 transformers 的 Trainer 之上,以支持在 Habana 的 Gaudi 上部署。
一个辅助包装器,它根据情况创建适合 autocast
的上下文管理器,同时向其提供所需的参数。Habana对其进行了修改,以支持在 Gaudi 设备上使用 autocast
。
从 https://github.com/huggingface/transformers/blob/v4.38.2/src/transformers/trainer.py#L3162 并进行以下修改
- 注释掉与 TPU 相关的部分
- 在评估吞吐量计算中使用 throughput_warmup_steps
评估循环
评估循环 < 源代码 >( dataloader: DataLoader description: str prediction_loss_only: 可选 = None ignore_keys: 可选 = None metric_key_prefix: str = 'eval' )
预测/评估循环,由 Trainer.evaluate()
和 Trainer.predict()
共享。适用于有标签和无标签的情况。
在观察训练的各种对象上记录 logs
。子类并覆盖此方法以注入自定义行为。
预测循环
预测循环 < 源代码 >( dataloader: DataLoader description: str prediction_loss_only: 可选 = None ignore_keys: 可选 = None metric_key_prefix: str = 'eval' )
预测/评估循环,由 Trainer.evaluate()
和 Trainer.predict()
共享。适用于有标签和无标签的情况。
预测步骤
预测步骤 < 源代码 >( model: 模块 inputs: Dict prediction_loss_only: bool ignore_keys: 可选 = None ) → Tuple[可选[torch.Tensor], 可选[torch.Tensor], 可选[torch.Tensor]]
使用inputs
对model
执行评估步骤。 子类并覆盖以注入自定义行为。
将保存模型,以便可以使用from_pretrained()
重新加载它。 仅保存主进程中的模型。
train
< 源代码 > ( resume_from_checkpoint: Union = None trial: Union = None ignore_keys_for_eval: Optional = None **kwargs )
参数
- resume_from_checkpoint (
str
或bool
, 可选) — 如果是str
,则为先前Trainer
实例保存的已保存检查点的本地路径。 如果是bool
且等于True
,则加载先前Trainer
实例保存在args.output_dir中的最后一个检查点。 如果存在,训练将从这里加载的模型/优化器/调度器状态恢复。 - trial (
optuna.Trial
或Dict[str, Any]
, 可选) — 超参数搜索的试验运行或超参数字典。 - ignore_keys_for_eval (
List[str]
, 可选) — 模型输出(如果为字典)中在训练期间收集评估预测时应忽略的键列表。 - kwargs (
Dict[str, Any]
, 可选) — 用于隐藏已弃用参数的其他关键字参数
主要的训练入口点。
GaudiSeq2SeqTrainer
class optimum.habana.GaudiSeq2SeqTrainer
< 源代码 >( model: Union = None gaudi_config: GaudiConfig = None args: GaudiTrainingArguments = None data_collator: Optional = None train_dataset: Optional = None eval_dataset: Union = None tokenizer: Optional = None model_init: Optional = None compute_metrics: Optional = None callbacks: Optional = None optimizers: Tuple = (None, None) preprocess_logits_for_metrics: Optional = None )
评估
< 源代码 > ( eval_dataset: Optional = None ignore_keys: Optional = None metric_key_prefix: str = 'eval' **gen_kwargs )
参数
- eval_dataset (
Dataset
, 可选) — 如果您希望覆盖self.eval_dataset
,请传递一个数据集。如果它是Dataset,则model.forward()
方法不接受的列将自动删除。它必须实现__len__
方法。 - ignore_keys (
List[str]
, 可选) — 模型输出(如果它是字典)中在收集预测时应忽略的键列表。 - metric_key_prefix (
str
, 可选,默认为"eval"
) — 用作指标键前缀的可选前缀。例如,如果前缀为"eval"
(默认值),则指标“bleu”将命名为“eval_bleu”。 - max_length (
int
, 可选) — 使用生成方法预测时使用的最大目标长度。 - num_beams (
int
, 可选) — 使用 generate 方法预测时将使用的波束搜索的波束数。1 表示不使用波束搜索。gen_kwargs — 其他generate
特定的关键字参数。
运行评估并返回指标。调用脚本将负责提供计算指标的方法,因为它们是依赖于任务的(将其传递给 init compute_metrics
参数)。您还可以子类化并覆盖此方法以注入自定义行为。
预测
< 源代码 > ( test_dataset: Dataset ignore_keys: Optional = None metric_key_prefix: str = 'test' **gen_kwargs )
参数
- test_dataset (
Dataset
) — 要在其上运行预测的数据集。如果它是 Dataset,则会自动删除model.forward()
方法不接受的列。必须实现__len__
方法 - ignore_keys (
List[str]
, 可选) — 模型输出中(如果它是字典)应在收集预测时忽略的一系列键。 - metric_key_prefix (
str
, 可选,默认为"eval"
) — 用于作为指标键前缀的可选前缀。例如,如果前缀为"eval"
(默认值),则指标“bleu”将命名为“eval_bleu” - max_length (
int
, 可选) — 使用 generate 方法预测时要使用的最大目标长度。 - num_beams (
int
, 可选) — 使用 generate 方法预测时将使用的波束搜索的波束数。1 表示不使用波束搜索。gen_kwargs — 其他generate
特定的关键字参数。
运行预测并返回预测和潜在的指标。根据数据集和您的用例,您的测试数据集可能包含标签。在这种情况下,此方法还会返回指标,就像在 evaluate()
中一样。
GaudiTrainingArguments
类 optimum.habana.GaudiTrainingArguments
< 源代码 >( output_dir: str overwrite_output_dir: bool = False do_train: bool = False do_eval: bool = False do_predict: bool = False eval_strategy: Union = 'no' prediction_loss_only: bool = False per_device_train_batch_size: int = 8 per_device_eval_batch_size: int = 8 per_gpu_train_batch_size: Optional = None per_gpu_eval_batch_size: Optional = None gradient_accumulation_steps: int = 1 eval_accumulation_steps: Optional = None eval_delay: Optional = 0 torch_empty_cache_steps: Optional = None learning_rate: float = 5e-05 weight_decay: float = 0.0 adam_beta1: float = 0.9 adam_beta2: float = 0.999 adam_epsilon: Optional = 1e-06 max_grad_norm: float = 1.0 num_train_epochs: float = 3.0 max_steps: int = -1 lr_scheduler_type: Union = 'linear' lr_scheduler_kwargs: Union = <factory> warmup_ratio: float = 0.0 warmup_steps: int = 0 log_level: Optional = 'passive' log_level_replica: Optional = 'warning' log_on_each_node: bool = True logging_dir: Optional = None logging_strategy: Union = 'steps' logging_first_step: bool = False logging_steps: float = 500 logging_nan_inf_filter: Optional = False save_strategy: Union = 'steps' save_steps: float = 500 save_total_limit: Optional = None save_safetensors: Optional = True save_on_each_node: bool = False save_only_model: bool = False restore_callback_states_from_checkpoint: bool = False no_cuda: bool = False use_cpu: bool = False use_mps_device: bool = False seed: int = 42 data_seed: Optional = None jit_mode_eval: bool = False use_ipex: bool = False bf16: bool = False fp16: bool = False fp16_opt_level: str = 'O1' half_precision_backend: str = 'hpu_amp' bf16_full_eval: bool = False fp16_full_eval: bool = False tf32: Optional = None local_rank: int = -1 ddp_backend: Optional = 'hccl' tpu_num_cores: Optional = None tpu_metrics_debug: bool = False debug: Union = '' dataloader_drop_last: bool = False eval_steps: Optional = None dataloader_num_workers: int = 0 dataloader_prefetch_factor: Optional = None past_index: int = -1 run_name: Optional = None disable_tqdm: Optional = None remove_unused_columns: Optional = True label_names: Optional = None load_best_model_at_end: Optional = False metric_for_best_model: Optional = None greater_is_better: Optional = None ignore_data_skip: bool = False fsdp: Union = '' fsdp_min_num_params: int = 0 fsdp_config: Union = None fsdp_transformer_layer_cls_to_wrap: Optional = None accelerator_config: Union = None deepspeed: Union = None label_smoothing_factor: float = 0.0 optim: Union = 'adamw_torch' optim_args: Optional = None adafactor: bool = False group_by_length: bool = False length_column_name: Optional = 'length' report_to: Union = None ddp_find_unused_parameters: Optional = False ddp_bucket_cap_mb: Optional = 230 ddp_broadcast_buffers: Optional = None dataloader_pin_memory: bool = True dataloader_persistent_workers: bool = False skip_memory_metrics: bool = True use_legacy_prediction_loop: bool = False push_to_hub: bool = False resume_from_checkpoint: Optional = None hub_model_id: Optional = None hub_strategy: Union = 'every_save' hub_token: Optional = None hub_private_repo: bool = False hub_always_push: bool = False gradient_checkpointing: bool = False gradient_checkpointing_kwargs: Union = None include_inputs_for_metrics: bool = False eval_do_concat_batches: bool = True fp16_backend: str = 'auto' evaluation_strategy: Union = None push_to_hub_model_id: Optional = None push_to_hub_organization: Optional = None push_to_hub_token: Optional = None mp_parameters: str = '' auto_find_batch_size: bool = False full_determinism: bool = False torchdynamo: Optional = None ray_scope: Optional = 'last' ddp_timeout: Optional = 1800 torch_compile: bool = False torch_compile_backend: Optional = None torch_compile_mode: Optional = None dispatch_batches: Optional = None split_batches: Optional = None include_tokens_per_second: Optional = False include_num_input_tokens_seen: Optional = False neftune_noise_alpha: Optional = None optim_target_modules: Union = None batch_eval_metrics: bool = False eval_on_start: bool = False use_liger_kernel: Optional = False eval_use_gather_object: Optional = False use_habana: Optional = False gaudi_config_name: Optional = None use_lazy_mode: Optional = True use_hpu_graphs: Optional = False use_hpu_graphs_for_inference: Optional = False use_hpu_graphs_for_training: Optional = False use_compiled_autograd: Optional = False compile_dynamic: Optional = None disable_tensor_cache_hpu_graphs: Optional = False max_hpu_graphs: Optional = None distribution_strategy: Optional = 'ddp' throughput_warmup_steps: Optional = 0 adjust_throughput: bool = False pipelining_fwd_bwd: Optional = False ignore_eos: Optional = True non_blocking_data_copy: Optional = False profiling_warmup_steps: Optional = 0 profiling_steps: Optional = 0 profiling_record_shapes: Optional = True fp8: Optional = False )
参数
- use_lazy_mode (
bool
,可选,默认为True
) — 是否使用惰性模式运行模型。 - use_hpu_graphs (
bool
,可选,默认为False
) — 已弃用,请使用use_hpu_graphs_for_inference
代替。是否使用 HPU 图进行推理。 - use_hpu_graphs_for_inference (
bool
,可选,默认为False
) — 是否使用 HPU 图进行推理。这将加快延迟,但可能与某些操作不兼容。 - use_hpu_graphs_for_training (
bool
,可选,默认为False
) — 是否使用 HPU 图进行训练。这将加快训练速度,但可能与某些操作不兼容。 - use_compiled_autograd (
bool
,可选,默认为False
) — 是否使用编译后的自动微分进行训练。目前仅适用于摘要模型。 - compile_dynamic (
bool|None
,可选,默认为None
) — 设置torch.compile
的 ‘dynamic’ 参数的值。 - disable_tensor_cache_hpu_graphs (
bool
,可选,默认为False
) — 是否在使用 hpu 图时禁用张量缓存。如果为 True,则张量不会缓存在 hpu 图中,可以节省内存。 - max_hpu_graphs (
int
,可选) — 要缓存的最大 HPU 图数量。减少以节省设备内存。 - distribution_strategy (
str
,可选,默认为ddp
) — 确定如何实现数据并行分布式训练。可以是:ddp
或fast_ddp
。 - pipelining_fwd_bwd (
bool
, 可选,默认为False
) — 是否在正向和反向之间添加一个额外的mark_step
,用于流水线主机反向构建和 HPU 正向计算。 - non_blocking_data_copy (
bool
, 可选,默认为False
) — 是否在准备输入时启用异步数据复制。 - profiling_warmup_steps (
int
, 可选,默认为 0) — 要忽略的概要分析步骤数。 - profiling_steps (
int
, 可选,默认为 0) — 启用概要分析时要捕获的步骤数。
GaudiTrainingArguments 构建在 Transformers 的 TrainingArguments 之上,以支持在 Habana 的 Gaudi 上部署。
GaudiSeq2SeqTrainingArguments
类 optimum.habana.GaudiSeq2SeqTrainingArguments
< 源代码 >( output_dir: str overwrite_output_dir: bool = False do_train: bool = False do_eval: bool = False do_predict: bool = False eval_strategy: Union = 'no' prediction_loss_only: bool = False per_device_train_batch_size: int = 8 per_device_eval_batch_size: int = 8 per_gpu_train_batch_size: Optional = None per_gpu_eval_batch_size: Optional = None gradient_accumulation_steps: int = 1 eval_accumulation_steps: Optional = None eval_delay: Optional = 0 torch_empty_cache_steps: Optional = None learning_rate: float = 5e-05 weight_decay: float = 0.0 adam_beta1: float = 0.9 adam_beta2: float = 0.999 adam_epsilon: Optional = 1e-06 max_grad_norm: float = 1.0 num_train_epochs: float = 3.0 max_steps: int = -1 lr_scheduler_type: Union = 'linear' lr_scheduler_kwargs: Union = <factory> warmup_ratio: float = 0.0 warmup_steps: int = 0 log_level: Optional = 'passive' log_level_replica: Optional = 'warning' log_on_each_node: bool = True logging_dir: Optional = None logging_strategy: Union = 'steps' logging_first_step: bool = False logging_steps: float = 500 logging_nan_inf_filter: Optional = False save_strategy: Union = 'steps' save_steps: float = 500 save_total_limit: Optional = None save_safetensors: Optional = True save_on_each_node: bool = False save_only_model: bool = False restore_callback_states_from_checkpoint: bool = False no_cuda: bool = False use_cpu: bool = False use_mps_device: bool = False seed: int = 42 data_seed: Optional = None jit_mode_eval: bool = False use_ipex: bool = False bf16: bool = False fp16: bool = False fp16_opt_level: str = 'O1' half_precision_backend: str = 'hpu_amp' bf16_full_eval: bool = False fp16_full_eval: bool = False tf32: Optional = None local_rank: int = -1 ddp_backend: Optional = 'hccl' tpu_num_cores: Optional = None tpu_metrics_debug: bool = False debug: Union = '' dataloader_drop_last: bool = False eval_steps: Optional = None dataloader_num_workers: int = 0 dataloader_prefetch_factor: Optional = None past_index: int = -1 run_name: Optional = None disable_tqdm: Optional = None remove_unused_columns: Optional = True label_names: Optional = None load_best_model_at_end: Optional = False metric_for_best_model: Optional = None greater_is_better: Optional = None ignore_data_skip: bool = False fsdp: Union = '' fsdp_min_num_params: int = 0 fsdp_config: Union = None fsdp_transformer_layer_cls_to_wrap: Optional = None accelerator_config: Union = None deepspeed: Union = None label_smoothing_factor: float = 0.0 optim: Union = 'adamw_torch' optim_args: Optional = None adafactor: bool = False group_by_length: bool = False length_column_name: Optional = 'length' report_to: Union = None ddp_find_unused_parameters: Optional = False ddp_bucket_cap_mb: Optional = 230 ddp_broadcast_buffers: Optional = None dataloader_pin_memory: bool = True dataloader_persistent_workers: bool = False skip_memory_metrics: bool = True use_legacy_prediction_loop: bool = False push_to_hub: bool = False resume_from_checkpoint: Optional = None hub_model_id: Optional = None hub_strategy: Union = 'every_save' hub_token: Optional = None hub_private_repo: bool = False hub_always_push: bool = False gradient_checkpointing: bool = False gradient_checkpointing_kwargs: Union = None include_inputs_for_metrics: bool = False eval_do_concat_batches: bool = True fp16_backend: str = 'auto' evaluation_strategy: Union = None push_to_hub_model_id: Optional = None push_to_hub_organization: Optional = None push_to_hub_token: Optional = None mp_parameters: str = '' auto_find_batch_size: bool = False full_determinism: bool = False torchdynamo: Optional = None ray_scope: Optional = 'last' ddp_timeout: Optional = 1800 torch_compile: bool = False torch_compile_backend: Optional = None torch_compile_mode: Optional = None dispatch_batches: Optional = None split_batches: Optional = None include_tokens_per_second: Optional = False include_num_input_tokens_seen: Optional = False neftune_noise_alpha: Optional = None optim_target_modules: Union = None batch_eval_metrics: bool = False eval_on_start: bool = False use_liger_kernel: Optional = False eval_use_gather_object: Optional = False use_habana: Optional = False gaudi_config_name: Optional = None use_lazy_mode: Optional = True use_hpu_graphs: Optional = False use_hpu_graphs_for_inference: Optional = False use_hpu_graphs_for_training: Optional = False use_compiled_autograd: Optional = False compile_dynamic: Optional = None disable_tensor_cache_hpu_graphs: Optional = False max_hpu_graphs: Optional = None distribution_strategy: Optional = 'ddp' throughput_warmup_steps: Optional = 0 adjust_throughput: bool = False pipelining_fwd_bwd: Optional = False ignore_eos: Optional = True non_blocking_data_copy: Optional = False profiling_warmup_steps: Optional = 0 profiling_steps: Optional = 0 profiling_record_shapes: Optional = True fp8: Optional = False sortish_sampler: bool = False predict_with_generate: bool = False generation_max_length: Optional = None generation_num_beams: Optional = None generation_config: Union = None )
参数
- sortish_sampler (
bool
, 可选,默认为False
) — 是否使用 *sortish sampler*。目前仅当底层数据集为 *Seq2SeqDataset* 时才可使用,但不久的将来将普遍可用。它根据长度对输入进行排序,以最大程度地减少填充大小,并为训练集提供一些随机性。 - predict_with_generate (
bool
, 可选,默认为False
) — 是否使用 generate 来计算生成指标(ROUGE、BLEU)。 - generation_max_length (
int
, 可选) — 当predict_with_generate=True
时,在每个评估循环中使用的max_length
。将默认为模型配置的max_length
值。
GaudiSeq2SeqTrainingArguments 构建在 Transformers 的 Seq2SeqTrainingArguments 之上,以支持在 Habana 的 Gaudi 上部署。
序列化此实例,同时将Enum
替换为其值,并将GaudiGenerationConfig
替换为字典(以支持 JSON 序列化)。它通过删除其值来模糊化令牌值。