EasyContext完全指南从零开始训练100万token上下文的大语言模型【免费下载链接】EasyContextMemory optimization and training recipes to extrapolate language models context length to 1 million tokens, with minimal hardware.项目地址: https://gitcode.com/gh_mirrors/ea/EasyContextEasyContext是一个专注于内存优化和训练方法的开源项目旨在帮助开发者以最小的硬件成本将语言模型的上下文长度扩展到100万token。本文将为你提供从环境搭建到模型训练的完整流程让你轻松掌握长上下文模型训练的核心技术。为什么选择EasyContext在大语言模型领域上下文长度是衡量模型能力的重要指标。许多公司都在宣传其模型处理长上下文的能力但对于普通开发者来说100万token的上下文似乎仍然遥不可及。EasyContext的出现正是为了揭开长上下文扩展的神秘面纱它通过组合现有技术实现了在有限硬件资源下训练超长上下文模型的目标。核心优势硬件要求低仅需8张A100显卡即可训练7B模型至700K上下文长度16张A100可支持13B模型达到100万token上下文全精度训练无需近似采用全微调、全注意力和全序列长度训练代码简洁核心训练脚本train.py不到200行代码易于理解和修改多种并行方式支持环形注意力Ring attention、分布式Flash注意力Dist flash attention和Deepspeed Ulysses等多种序列并行方法环境准备快速搭建训练环境硬件要求GPU至少8张A100建议40GB或80GB显存CPU至少16核推荐32核以上内存至少128GB RAM存储至少500GB可用空间用于存储模型和数据集软件安装步骤创建并激活虚拟环境conda create -n easycontext python3.10 -y conda activate easycontext安装PyTorch必须使用nightly版本以支持超长上下文pip install --pre torch2.4.0.dev20240324 --index-url https://download.pytorch.org/whl/nightly/cu118安装依赖项pip install packaging pip install ninja pip install flash-attn --no-build-isolation --no-cache-dir pip install -r requirements.txt提示requirements.txt中包含了accelerate、datasets、transformers等核心依赖以及ring_flash_attn等特殊注意力实现核心技术解析长上下文扩展的秘密EasyContext整合了多种先进技术使其能够在有限硬件资源下训练超长上下文模型。以下是关键技术的简要介绍1. 序列并行Sequence Parallelism序列并行是将长序列分割到多个GPU上进行处理的技术有效降低了单卡的内存压力。EasyContext支持多种序列并行实现环形注意力Ring Attention通过将注意力矩阵分割并在GPU间环形传递实现长序列的并行计算分布式Flash注意力基于LightSeq实现的分布式注意力优化了通信效率Ulysses注意力Deepspeed推出的序列并行方案进一步优化了长上下文场景下的性能相关实现代码可在以下目录找到环形注意力easy_context/zigzag_ring_attn/分布式Flash注意力easy_context/dist_flash_attn/Ulysses注意力easy_context/ulysses_attn/2. 内存优化技术除了序列并行EasyContext还采用了多种内存优化技术Deepspeed Zero3 Offload将优化器状态、梯度和参数卸载到CPU内存显著降低GPU内存占用Flash Attention使用高效的Flash Attention实现减少内存使用并提高计算速度激活检查点Activation Checkpointing在反向传播时重新计算激活值以时间换空间这些技术的组合使得在8张A100上训练700K上下文长度的7B模型成为可能。3. RoPE theta调整RoPERotary Position Embedding是许多现代语言模型采用的位置编码方法。通过逐步增加RoPE的theta参数可以扩展模型对长序列的建模能力。EasyContext采用渐进式调整策略从1M逐步增加到1B使模型能够泛化到更长的上下文。实战训练一步步构建100万token模型EasyContext提供了完整的训练脚本位于train_scripts/目录下。以下是使用EasyContext-1M-Llama-2-7B.sh训练脚本的主要步骤阶段1基础模型训练32K上下文accelerate launch \ --config_file accelerate_configs/single_node.yaml \ train.py \ --batch-size 1 \ --gradient-accumulate-every 4 \ --output-dir ./output/7B_32K_bs_1M_rope_1M_step_1000_lr_2e-5 \ --wandb EasyContext \ --max-train-steps 1000 \ --learning-rate 2e-5 \ --dataset yaofu/slimpajama-per-source-length-upsample \ --model meta-llama/Llama-2-7b-hf \ --seq-length 32768 \ --rope-theta 1000000 \ --parallel_mode data_parallel阶段2逐步扩展上下文长度训练过程采用渐进式扩展策略从32K逐步增加到256K、512K最后达到100万token64K上下文训练使用5M RoPE theta256K上下文训练使用10M RoPE theta512K上下文训练使用100M RoPE theta最终调整RoPE theta至1B实现100万token上下文每个阶段都以上一阶段的输出作为初始模型逐步适应更长的序列长度。训练配置说明batch-size批大小设为1通过梯度累积gradient-accumulate-every来模拟更大的批处理seq-length每个阶段的序列长度从32768逐步增加到512000rope-thetaRoPE位置编码的theta参数随序列长度增加而增大parallel_mode并行模式从data_parallel过渡到zigzag_ring_attn以支持更长序列性能评估长上下文模型效果如何训练完成后我们需要评估模型在长上下文场景下的表现。EasyContext提供了两种主要评估方法1. Needle-in-a-haystack测试这个测试评估模型在长文本中查找特定信息的能力。测试将 needle特定信息嵌入到不同长度的文本中测量模型的提取准确率。图不同上下文长度和深度下的Needle-in-a-haystack测试结果颜色越深表示准确率越高测试命令accelerate launch --num_processes 8 --config_file accelerate_configs/deepspeed_inference.yaml --main_process_port 6000 eval_needle.py \ --model PY007/EasyContext-1M-Llama-2-7B \ --max_context_length 1000000 \ --min_context_length 50000 \ --context_interval 50000 \ --depth_interval 0.1 \ --num_samples 2 \ --rnd_number_digits 7 \ --haystack_dir PaulGrahamEssays2. 困惑度Perplexity评估困惑度是衡量语言模型预测能力的标准指标。EasyContext在超长文本上的困惑度表现如下图EasyContext-1M-Llama-2-7B模型在不同上下文窗口大小下的困惑度曲线测试命令accelerate launch --config_file accelerate_configs/deepspeed_inference.yaml --num_processes 8 --main_process_port 6000 eval_ppl.py \ --tokenized emozilla/proofpile-test-tokenized \ --dataset-min-tokens 500000 \ --samples 2 \ --output-file data/debug.csv \ --min-tokens 50000 \ --max-tokens 500000 \ --tokens-step 50000 \ --truncate \ --aggressive-memory \ -m PY007/EasyContext-1M-Llama-2-7B实际应用如何使用训练好的模型训练完成后你可以像使用普通Hugging Face模型一样使用EasyContext模型。以下是基本使用示例from easy_context import prepare_seq_parallel_inputs, apply_seq_parallel_monkey_patch from transformers import LlamaForCausalLM, AutoTokenizer # 应用序列并行monkey patch apply_seq_parallel_monkey_patch(dist_flash_attn, llama) # 加载模型和tokenizer model_name ./output/7B_0.5M_bs_1M_rope_250M_step_90_lr_2e-5 tokenizer AutoTokenizer.from_pretrained(model_name) model LlamaForCausalLM.from_pretrained(model_name, _attn_implementationflash_attention_2) model.eval() # 准备长文本输入 long_text ... # 你的超长文本 inputs tokenizer(long_text, return_tensorspt) # 序列并行处理 prepared prepare_seq_parallel_inputs(dist_flash_attn, inputs[input_ids], inputs[position_ids], None, process_index0, num_processes8, devicecuda) # 模型推理 outputs model(prepared[local_input_ids], position_idsprepared[local_position_ids])常见问题与解决方案Q: 训练过程中出现内存不足OOM怎么办A: 尝试以下解决方案确保使用PyTorch nightly版本减少batch-size增加gradient-accumulate-every启用更激进的Deepspeed Zero3 Offload配置检查是否使用了Flash AttentionQ: 模型在长上下文下的表现不如预期A: 可能原因和解决方法训练步数不足尝试增加max-train-stepsRoPE theta调整策略不当检查训练脚本中的theta参数设置数据质量问题确保使用高质量的长文本数据集Q: 如何在多节点环境下训练A: EasyContext提供了多节点配置文件位于accelerate_configs/two_node.yaml可根据实际节点数量调整配置。总结与展望EasyContext通过组合现有技术成功实现了在有限硬件资源下训练100万token上下文长度的语言模型。其核心优势在于低硬件要求、全精度训练和简洁的代码实现为普通开发者提供了探索长上下文模型的机会。未来EasyContext团队计划推出更多功能包括Mistral-7B和Llama-2-13B的1M上下文模型、指令微调版本等。社区贡献和合作非常欢迎如果你有兴趣可以通过提交issue或pull request参与项目开发。通过本指南你应该已经掌握了使用EasyContext训练超长上下文模型的基本流程。现在是时候开始你的长上下文模型之旅了【免费下载链接】EasyContextMemory optimization and training recipes to extrapolate language models context length to 1 million tokens, with minimal hardware.项目地址: https://gitcode.com/gh_mirrors/ea/EasyContext创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考