250925-0930技术总结
-
thinking模型的输出时间与输出内容长度有关,变化浮动很大
-
思考模型的过度思考会消耗大量的资源与推理时间,怎么在训练时减少无效的思考。或者推理时能否通过prompt或者max-token来限制思考过程。
-
qwen-32b的推理时间为什么会比30b-a3b的推理快?但是对于同样的输出,每一次的输出都相同,怎么增加每一次的输出的多样性?
-
语言模型的推理有时候会非常慢,卡住了一样
-
语言模型的推理时间好像跟输出token有很大关系,输出越长推理时间越多
-
在 f-string 内部,当需要表示字符串时,使用与外层 f-string 不同的引号。
f"Error processing item: {e}, {partial_state.process_index}, {item['image']}"
-
模型输出的时候耗时过长问题:出现幻觉,不停的重复token。还有一种情况像自己进入了think模式一样,会输出think内容与<\think>。耗时也会增加
-
多卡推理的时候,每张卡跑的速度不一样,有个环境变量会check多卡的通信超时时间,默认是10min。所以不要设置partial_state.wait_for_everyone()这种函数比较好
-
并行推理训练。数据并行,序列并行。是一种比数据并行更精细的并行策略,特别用于处理超长序列的 Transformer 模型。它将模型的每一层(如 Attention 层、FFN 层)在不同 GPU 上进行切分。例如,一个 Attention 层的查询(Q)、键(K)、值(V)线性投影可以被拆分到不同的 GPU 上计算。
# initialize_sequence_parallel_state(args.sp_size) 会设置好进行这种模型层内切分所需的内部状态。args.sp_size 很可能指定了参与序列并行的 GPU 数量
initialize_sequence_parallel_state(args.sp_size)
- 并行训练框架**FSDP (Fully Sharded Data Parallel)。**FSDP 的核心思想是:不让每个 GPU 都持有完整的模型副本,而是将模型的参数、梯度和优化器状态切分成多份,让每个 GPU 只持有其中一份。 这样一来,模型大小就不再受单张 GPU 显存的限制,使得在有限的硬件上训练千亿级参数的模型成为可能。
# 1. 创建 FSDP 的配置对象
fsdp_config = FSDPConfig(sharding_strategy="FULL_SHARD",backward_prefetch="BACKWARD_PRE",cpu_offload=False, num_replicate=1,num_shard=world_size,mixed_precision_dtype=torch.bfloat16,use_device_mesh=False,
)
-
EMA (Exponential Moving Average) 是一种提升模型性能和稳定性的技术,它会维护一个模型参数的 “影子副本”,这个副本是历史参数的移动平均值。
-
设置环境变量
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
# export PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True"
-
FSDP会将模型分片放入每张显卡中,所以卡越多每张卡占用的显存越少,卡少的时候会出现训练显存爆掉的问题。在显存足够的情况下,尽量放到一张卡上,不然会占用更多资源。切片越多显存碎片也会越多
-
torchrun启动命令时,如果是给torchrun使用的必须使用=,如果是给python脚本使用的,推荐使用空格
torchrun --nproc_per_node=8 \--nnodes=2 \--master_port=${MASTER_PORT} \--master_addr=${MASTER_ADDR} \--node_rank=${RANK} \fastvideo/train_grpo_qwenimage_edit.py \--seed 42 \
-
训练框架 FSDP,deepspeed, torchrun, accelerate, peft