我最近一直在使用更大的模型,如 Mixtral 8x7B、Qwen-120B 和 Miqu-70B。但在使用更大的模型时,最重要的是训练期间所需的计算资源量。我一直在使用 Deepspeed 进行多 GPU 训练,了解每个阶段(零 1、零 2、零 3)带来的差异。我还将重点介绍一项最新技术(FSDP+Qlora),用于在消费级 GPU 上训练更大的模型。
Miqu 70B
随着 Abacus AI 新数据集的发布,我尝试在 SystemChat 上使用 2x A100s 和 Deepspeed Zero-2 对 Miqu-70B 进行微调。我还尝试了 Deepspeed Zero-3,但由于 Axolotl 在量化和 OOM 方面出现了多个问题,我又回到了 Zero-2。Zero-2 的一些亮点在于,它只在 GPU 上划分优化器状态和梯度,但模型参数会复制到每个 GPU 上,而在 Zero-3 中,模型权重也会分布到所有 GPU 上。解放的 Miqu 70B 是一个完全未经审查的模型。因此在使用时一定要小心。我使用 Qlora 和 axolotl 对模型进行了 1 个历元的训练。本实验的 axolotl 配置如下所示。
base_model: 152334H/miqu-1-70b-sf
model_type: LlamaForCausalLM
tokenizer_type: LlamaTokenizer
load_in_8bit: false
load_in_4bit: true
strict: false
datasets:
- path: abacusai/SystemChat
type: sharegpt
dataset_prepared_path:
val_set_size: 0
output_dir: /workspace/miqu-systemchat
resume_from_checkpoint:
hf_use_auth_token:
adapter: qlora
lora_model_dir:
sequence_len: 2048
sample_packing: true
pad_to_sequence_len: true
lora_r: 16
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
lora_target_linear: true
lora_fan_in_fan_out:
lora_modules_to_save:
- embed_tokens
- lm_head
wandb_project: Miqu-Systemchat-multiGPU
wandb_entity:
wandb_watch:
wandb_run_id:
wandb_log_model:
gradient_accumulation_steps: 1
micro_batch_size: 1
num_epochs: 1
optimizer: paged_adamw_8bit
lr_scheduler: cosine
learning_rate: 0.0002
train_on_inputs:
group_by_length: false
bf16: true
fp16: false
tf32: false
gradient_checkpointing: true
early_stopping_patience:
local_rank:
logging_steps: 1
xformers_attention:
flash_attention: true
warmup_steps: 100
eval_steps:
save_steps: 2000
save_total_limit: 2
eval_sample_packing:
debug:
deepspeed: deepspeed_configs/zero2.json
weight_decay: 0.05
fsdp:
fsdp_config:
special_tokens:
tokens:
trust_remote_code: true
Liberated-Miqu-70B: https://huggingface.co/abideen/Liberated-Miqu-70B
Liberated-Miqu-70B: https://huggingface.co/abideen/Liberated-Miqu-70B
FSDP+Qlora
Answer.ai 发布了一项新技术,利用 FSDP 和 Qlora 在消费级 GPU(RTX 3090 或 4090)上训练更大的模型。通常使用两类硬件,一类是数据中心级硬件,如 H100 和 A100,另一类是包含游戏 GPU 的台式电脑,如双 4090 和 3090。我们的想法很简单:想办法用这些便宜 10 倍的 GPU 来训练最好的开源模型。这就是 Answer.ai 的fsdp+Qlora派上用场的地方。我使用 2x 3090 上的 Mixtral 8x7B 对 FSDP+Qlora 进行了测试。这项技术也被实验性地集成到 Axolotl 库中。在 Answer.ai 的博客中,他们没有提到任何关于使用消费级 GPU 的速度和时间限制。为了尝试一下,我只在 100 个步骤上训练 Mixtral,但这需要 70 个小时,时间太长了。由于实验耗时太长,我无法完成这项实验。因此,在这项技术变得更有效率之前,我现在又开始使用 A100。本实验的 axolotl 配置文件如下。
base_model: mistralai/Mixtral-8x7B-v0.1
model_type: AutoModelForCausalLM
tokenizer_type: LlamaTokenizer
trust_remote_code: true
load_in_8bit: false
load_in_4bit: true
strict: false
datasets:
- path: cognitivecomputations/WizardLM_evol_instruct_V2_196k_unfiltered_merged_split
type: sharegpt
conversation: chatml
dataset_prepared_path: last_run_prepared
val_set_size: 0.02
output_dir: ./qlora-out
model_config:
output_router_logits: true
adapter: qlora
lora_model_dir:
sequence_len: 1024
sample_packing: false
pad_to_sequence_len: false
lora_r: 16
lora_alpha: 16
lora_dropout: 0.05
lora_target_linear: true
lora_fan_in_fan_out:
wandb_project: fsdp
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:
gradient_accumulation_steps: 4
micro_batch_size: 2
num_epochs: 1
max_steps: 100
optimizer: paged_adamw_8bit
lr_scheduler: cosine
learning_rate: 0.0002
train_on_inputs: false
group_by_length: false
bf16: auto
fp16:
tf32: false
gradient_checkpointing: true
early_stopping_patience:
resume_from_checkpoint:
local_rank:
logging_steps: 1
xformers_attention:
flash_attention: true
loss_watchdog_threshold: 5.0
loss_watchdog_patience: 3
warmup_steps: 10
evals_per_epoch: 4
eval_table_size:
eval_max_new_tokens: 128
saves_per_epoch: 1
debug:
weight_decay: 0.0
fsdp:
- full_shard
fsdp_config:
fsdp_transformer_layer_cls_to_wrap: MixtralSparseMoeBlock
special_tokens:
MegaQwen-120B
我还在 Qwen-70B 上尝试了交错技术,从Venus-120B 中汲取灵感,创建了 MegaQwen-120B。由于 120B 模型也需要大量的 VRAM 来进行训练,因此我深刻地认识到,必须先对 70B 模型进行微调,然后再进行交错,从而绕过内存限制。我试过先交错,然后再微调庞大的 120B 模型,结果出现了 OOM。我之前的逻辑是,120B 参数模型需要 240GB VRAM(4 位 -> 68GB),因此我使用了 4x A100,即 320GB VRAM,这样应该可以工作。但结果并不理想。主要原因是 Zero-2 在每个 GPU 上都有整个模型参数的副本,而 Pytorch 不知何故占用了 12GB,导致 80GB VRAM 的 A100 出现 OOM,所以使用 A100 并没有什么区别。此外,Zero-3(模型参数分片)也因为出现错误而无法使用。我注意到了这些 OOM 错误,并将在今后更加谨慎地跟踪内存限制。本实验的 axolotl 配置如下。
base_model: abideen/Qwen-120B
model_type: Qwen2ForCausalLM
tokenizer_type: Qwen2Tokenizer
load_in_8bit: false
load_in_4bit: true
strict: false
datasets:
- path: abacusai/SystemChat
type: sharegpt
dataset_prepared_path:
val_set_size: 0
output_dir: /workspace/Qwen-120b-systemchat
resume_from_checkpoint:
hf_use_auth_token:
adapter: qlora
lora_model_dir:
sequence_len: 2048
sample_packing: true
pad_to_sequence_len: true
lora_r: 16
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
lora_target_linear: true
lora_fan_in_fan_out:
lora_modules_to_save:
- embed_tokens
- lm_head
wandb_project: Qwen-Systemchat-multiGPU
wandb_entity:
wandb_watch:
wandb_run_id:
wandb_log_model:
gradient_accumulation_steps: 1
micro_batch_size: 1
num_epochs: 1
optimizer: paged_adamw_8bit
lr_scheduler: cosine
learning_rate: 0.0002
train_on_inputs:
group_by_length: false
bf16: true
fp16: false
tf32: false
gradient_checkpointing: true
early_stopping_patience:
local_rank:
logging_steps: 1
xformers_attention:
flash_attention: true
warmup_steps: 100
eval_steps:
save_steps: 2000
save_total_limit: 2
eval_sample_packing:
debug:
deepspeed:
weight_decay: 0.05
fsdp:
fsdp_config:
special_tokens:
eos_token: "<|im_end|>"
tokens:
- "<|im_start|>"
trust_remote_code: true
总结
总而言之,在最好的开源模型上尝试多 GPU 训练是一次很好的体验。