diff --git a/eval_llm.py b/eval_llm.py index 9359ca8..e9f8a68 100755 --- a/eval_llm.py +++ b/eval_llm.py @@ -3,6 +3,10 @@ import argparse import random import warnings import torch +try: + import torch_npu +except: + torch_npu = None from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer from model.model_minimind import MiniMindConfig, MiniMindForCausalLM from model.model_lora import * @@ -45,7 +49,10 @@ def main(): parser.add_argument('--open_thinking', default=0, type=int, help="是否开启自适应思考(0=否,1=是)") parser.add_argument('--historys', default=0, type=int, help="携带历史对话轮数(需为偶数,0表示不携带历史)") parser.add_argument('--show_speed', default=1, type=int, help="显示decode速度(tokens/s)") - parser.add_argument('--device', default='cuda' if torch.cuda.is_available() else 'cpu', type=str, help="运行设备") + parser.add_argument('--device', + default='cuda' if torch.cuda.is_available() else ('npu' if torch_npu and torch_npu.npu.is_available() else 'cpu'), + type=str, + help="运行设备") args = parser.parse_args() prompts = [ diff --git a/scripts/eval_toolcall.py b/scripts/eval_toolcall.py index da078b4..c94de4d 100644 --- a/scripts/eval_toolcall.py +++ b/scripts/eval_toolcall.py @@ -8,6 +8,10 @@ import random import argparse import warnings import torch +try: + import torch_npu +except: + torch_npu = None from datetime import datetime from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer from openai import OpenAI @@ -212,11 +216,14 @@ def main(): parser.add_argument('--temperature', default=0.9, type=float, help="生成温度,控制随机性(0-1,越大越随机)") parser.add_argument('--top_p', default=0.9, type=float, help="nucleus采样阈值(0-1)") parser.add_argument('--show_speed', default=0, type=int, help="显示decode速度(tokens/s)") - parser.add_argument('--device', default='cuda' if torch.cuda.is_available() else 'cpu', type=str, help="运行设备") parser.add_argument('--api_base_url', default="http://localhost:11434/v1", type=str, help="OpenAI兼容接口的base_url") parser.add_argument('--api_key', default='sk-123', type=str, help="OpenAI兼容接口的api_key") parser.add_argument('--api_model', default='jingyaogong/minimind-3:latest', type=str, help="API请求时使用的模型名称") parser.add_argument('--stream', default=1, type=int, help="API模式下是否流式输出(0=否,1=是)") + parser.add_argument('--device', + default='cuda' if torch.cuda.is_available() else ('npu' if torch_npu and torch_npu.npu.is_available() else 'cpu'), + type=str, + help="运行设备") args = parser.parse_args() model = tokenizer = client = None diff --git a/scripts/serve_openai_api.py b/scripts/serve_openai_api.py index 0550d4a..06612da 100644 --- a/scripts/serve_openai_api.py +++ b/scripts/serve_openai_api.py @@ -8,6 +8,10 @@ __package__ = "scripts" sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import time import torch +try: + import torch_npu +except: + torch_npu = None import warnings import uvicorn @@ -238,7 +242,10 @@ if __name__ == "__main__": parser.add_argument('--max_seq_len', default=8192, type=int, help="最大序列长度") parser.add_argument('--use_moe', default=0, type=int, choices=[0, 1], help="是否使用MoE架构(0=否,1=是)") parser.add_argument('--inference_rope_scaling', default=False, action='store_true', help="启用RoPE位置编码外推(4倍,仅解决位置编码问题)") - parser.add_argument('--device', default='cuda' if torch.cuda.is_available() else 'cpu', type=str, help="运行设备") + parser.add_argument('--device', + default='cuda' if torch.cuda.is_available() else ('npu' if torch_npu and torch_npu.npu.is_available() else 'cpu'), + type=str, + help="运行设备") args = parser.parse_args() device = args.device model, tokenizer = init_model(args) diff --git a/scripts/web_demo.py b/scripts/web_demo.py index b29030d..d433a53 100644 --- a/scripts/web_demo.py +++ b/scripts/web_demo.py @@ -5,6 +5,10 @@ import os from threading import Thread import torch +try: + import torch_npu +except: + torch_npu = None import numpy as np import streamlit as st from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer @@ -67,7 +71,7 @@ st.markdown(""" """, unsafe_allow_html=True) -device = "cuda" if torch.cuda.is_available() else "cpu" +device = "cuda" if torch.cuda.is_available() else ("npu" if torch_npu and torch_npu.npu.is_available() else "cpu") # 多语言文本 LANG_TEXTS = { diff --git a/trainer/train_agent.py b/trainer/train_agent.py index e652c3e..1d22f1c 100644 --- a/trainer/train_agent.py +++ b/trainer/train_agent.py @@ -13,6 +13,10 @@ import signal import argparse import warnings import torch +try: + import torch_npu +except: + torch_npu = None import torch.nn.functional as F import torch.distributed as dist from contextlib import nullcontext @@ -377,7 +381,6 @@ if __name__ == "__main__": parser.add_argument("--epochs", type=int, default=1, help="训练轮数") parser.add_argument("--batch_size", type=int, default=2, help="批次大小") parser.add_argument("--learning_rate", type=float, default=3e-7, help="学习率") - parser.add_argument("--device", type=str, default="cuda:0" if torch.cuda.is_available() else "cpu", help="训练设备") parser.add_argument("--dtype", type=str, default="bfloat16", help="数据类型 bfloat16/float16") parser.add_argument("--num_workers", type=int, default=8, help="数据加载线程数") parser.add_argument("--accumulation_steps", type=int, default=1, help="梯度累积步数") @@ -409,10 +412,14 @@ if __name__ == "__main__": parser.add_argument("--sglang_base_url", type=str, default="http://localhost:8998", help="SGLang服务器URL") parser.add_argument("--sglang_model_path", type=str, default="../model", help="SGLang tokenizer路径") parser.add_argument("--sglang_shared_path", type=str, default="./sglang_ckpt_agent", help="SGLang共享存储路径") + parser.add_argument("--device", + type=str, + default="cuda:0" if torch.cuda.is_available() else ("npu:0" if torch_npu and torch_npu.npu.is_available() else "cpu"), + help="训练设备") args = parser.parse_args() - local_rank = init_distributed_mode() - if dist.is_initialized(): args.device = f"cuda:{local_rank}" + local_rank = init_distributed_mode("nccl" if torch.cuda.is_available() else "hccl") + if dist.is_initialized(): args.device = f"cuda:{local_rank}" if torch.cuda.is_available() else f"npu:{local_rank}" setup_seed(42 + (dist.get_rank() if dist.is_initialized() else 0)) os.makedirs(args.save_dir, exist_ok=True) @@ -420,7 +427,7 @@ if __name__ == "__main__": max_seq_len=args.max_seq_len + args.max_gen_len, use_moe=bool(args.use_moe)) ckp_data = lm_checkpoint(lm_config, weight=args.save_weight, save_dir='../checkpoints') if args.from_resume == 1 else None - device_type = "cuda" if "cuda" in args.device else "cpu" + device_type = "cuda" if "cuda" in args.device else ("npu" if "npu" in args.device else "cpu") dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16 autocast_ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast(dtype=dtype) diff --git a/trainer/train_distillation.py b/trainer/train_distillation.py index 63b6025..f496893 100644 --- a/trainer/train_distillation.py +++ b/trainer/train_distillation.py @@ -8,6 +8,10 @@ import argparse import time import warnings import torch +try: + import torch_npu +except: + torch_npu = None import torch.nn.functional as F import torch.distributed as dist from contextlib import nullcontext @@ -150,7 +154,6 @@ if __name__ == "__main__": parser.add_argument("--epochs", type=int, default=6, help="训练轮数") parser.add_argument("--batch_size", type=int, default=32, help="batch size") parser.add_argument("--learning_rate", type=float, default=5e-6, help="初始学习率") - parser.add_argument("--device", type=str, default="cuda:0" if torch.cuda.is_available() else "cpu", help="训练设备") parser.add_argument("--dtype", type=str, default="bfloat16", help="混合精度类型") parser.add_argument("--num_workers", type=int, default=8, help="数据加载线程数") parser.add_argument("--accumulation_steps", type=int, default=1, help="梯度累积步数") @@ -173,11 +176,15 @@ if __name__ == "__main__": parser.add_argument("--use_wandb", action="store_true", help="是否使用wandb") parser.add_argument("--wandb_project", type=str, default="MiniMind-Distillation", help="wandb项目名") parser.add_argument("--use_compile", default=0, type=int, choices=[0, 1], help="是否使用torch.compile加速(0=否,1=是)") + parser.add_argument("--device", + type=str, + default="cuda:0" if torch.cuda.is_available() else ("npu:0" if torch_npu and torch_npu.npu.is_available() else "cpu"), + help="训练设备") args = parser.parse_args() # ========== 1. 初始化环境和随机种子 ========== - local_rank = init_distributed_mode() - if dist.is_initialized(): args.device = f"cuda:{local_rank}" + local_rank = init_distributed_mode("nccl" if torch.cuda.is_available() else "hccl") + if dist.is_initialized(): args.device = f"cuda:{local_rank}" if torch.cuda.is_available() else f"npu:{local_rank}" setup_seed(42 + (dist.get_rank() if dist.is_initialized() else 0)) # ========== 2. 配置目录、模型参数、检查ckp ========== @@ -187,7 +194,7 @@ if __name__ == "__main__": ckp_data = lm_checkpoint(lm_config_student, weight=args.save_weight, save_dir='../checkpoints') if args.from_resume==1 else None # ========== 3. 设置混合精度 ========== - device_type = "cuda" if "cuda" in args.device else "cpu" + device_type = "cuda" if "cuda" in args.device else ("npu" if "npu" in args.device else "cpu") dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16 autocast_ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast(dtype=dtype) diff --git a/trainer/train_dpo.py b/trainer/train_dpo.py index 558d108..eeea5d9 100644 --- a/trainer/train_dpo.py +++ b/trainer/train_dpo.py @@ -8,6 +8,10 @@ import argparse import time import warnings import torch +try: + import torch_npu +except: + torch_npu = None import torch.nn.functional as F import torch.distributed as dist from contextlib import nullcontext @@ -134,7 +138,6 @@ if __name__ == "__main__": parser.add_argument("--epochs", type=int, default=1, help="训练轮数") parser.add_argument("--batch_size", type=int, default=4, help="batch size") parser.add_argument("--learning_rate", type=float, default=4e-8, help="初始学习率(建议<=5e-8避免遗忘)") - parser.add_argument("--device", type=str, default="cuda:0" if torch.cuda.is_available() else "cpu", help="训练设备") parser.add_argument("--dtype", type=str, default="bfloat16", help="混合精度类型") parser.add_argument("--num_workers", type=int, default=8, help="数据加载线程数") parser.add_argument("--accumulation_steps", type=int, default=1, help="梯度累积步数") @@ -152,11 +155,15 @@ if __name__ == "__main__": parser.add_argument("--use_wandb", action="store_true", help="是否使用wandb") parser.add_argument("--wandb_project", type=str, default="MiniMind-DPO", help="wandb项目名") parser.add_argument("--use_compile", default=0, type=int, choices=[0, 1], help="是否使用torch.compile加速(0=否,1=是)") + parser.add_argument("--device", + type=str, + default="cuda:0" if torch.cuda.is_available() else ("npu:0" if torch_npu and torch_npu.npu.is_available() else "cpu"), + help="训练设备") args = parser.parse_args() # ========== 1. 初始化环境和随机种子 ========== - local_rank = init_distributed_mode() - if dist.is_initialized(): args.device = f"cuda:{local_rank}" + local_rank = init_distributed_mode("nccl" if torch.cuda.is_available() else "hccl") + if dist.is_initialized(): args.device = f"cuda:{local_rank}" if torch.cuda.is_available() else f"npu:{local_rank}" setup_seed(42 + (dist.get_rank() if dist.is_initialized() else 0)) # ========== 2. 配置目录、模型参数、检查ckp ========== @@ -165,7 +172,7 @@ if __name__ == "__main__": ckp_data = lm_checkpoint(lm_config, weight=args.save_weight, save_dir='../checkpoints') if args.from_resume==1 else None # ========== 3. 设置混合精度 ========== - device_type = "cuda" if "cuda" in args.device else "cpu" + device_type = "cuda" if "cuda" in args.device else ("npu" if "npu" in args.device else "cpu") dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16 autocast_ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast(dtype=dtype) diff --git a/trainer/train_full_sft.py b/trainer/train_full_sft.py index 51c755b..90969b7 100644 --- a/trainer/train_full_sft.py +++ b/trainer/train_full_sft.py @@ -8,6 +8,10 @@ import argparse import time import warnings import torch +try: + import torch_npu +except: + torch_npu = None import torch.distributed as dist from contextlib import nullcontext from torch import optim, nn @@ -87,7 +91,6 @@ if __name__ == "__main__": parser.add_argument("--epochs", type=int, default=2, help="训练轮数") parser.add_argument("--batch_size", type=int, default=16, help="batch size") parser.add_argument("--learning_rate", type=float, default=1e-5, help="初始学习率") - parser.add_argument("--device", type=str, default="cuda:0" if torch.cuda.is_available() else "cpu", help="训练设备") parser.add_argument("--dtype", type=str, default="bfloat16", help="混合精度类型") parser.add_argument("--num_workers", type=int, default=8, help="数据加载线程数") parser.add_argument("--accumulation_steps", type=int, default=1, help="梯度累积步数") @@ -104,11 +107,15 @@ if __name__ == "__main__": parser.add_argument("--use_wandb", action="store_true", help="是否使用wandb") parser.add_argument("--wandb_project", type=str, default="MiniMind-Full-SFT", help="wandb项目名") parser.add_argument("--use_compile", default=0, type=int, choices=[0, 1], help="是否使用torch.compile加速(0=否,1=是)") + parser.add_argument("--device", + type=str, + default="cuda:0" if torch.cuda.is_available() else ("npu:0" if torch_npu and torch_npu.npu.is_available() else "cpu"), + help="训练设备") args = parser.parse_args() # ========== 1. 初始化环境和随机种子 ========== - local_rank = init_distributed_mode() - if dist.is_initialized(): args.device = f"cuda:{local_rank}" + local_rank = init_distributed_mode("nccl" if torch.cuda.is_available() else "hccl") + if dist.is_initialized(): args.device = f"cuda:{local_rank}" if torch.cuda.is_available() else f"npu:{local_rank}" setup_seed(42 + (dist.get_rank() if dist.is_initialized() else 0)) # ========== 2. 配置目录、模型参数、检查ckp ========== @@ -117,7 +124,7 @@ if __name__ == "__main__": ckp_data = lm_checkpoint(lm_config, weight=args.save_weight, save_dir='../checkpoints') if args.from_resume==1 else None # ========== 3. 设置混合精度 ========== - device_type = "cuda" if "cuda" in args.device else "cpu" + device_type = "cuda" if "cuda" in args.device else ("npu" if "npu" in args.device else "cpu") dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16 autocast_ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast(dtype=dtype) diff --git a/trainer/train_grpo.py b/trainer/train_grpo.py index 52f7c7d..2cea524 100755 --- a/trainer/train_grpo.py +++ b/trainer/train_grpo.py @@ -10,6 +10,10 @@ import re import gc import warnings import torch +try: + import torch_npu +except: + torch_npu = None import torch.nn.functional as F import torch.distributed as dist from transformers import AutoTokenizer @@ -209,7 +213,6 @@ if __name__ == "__main__": parser.add_argument("--epochs", type=int, default=1, help="训练轮数") parser.add_argument("--batch_size", type=int, default=2, help="batch size") parser.add_argument("--learning_rate", type=float, default=3e-7, help="初始学习率") - parser.add_argument("--device", type=str, default="cuda:0" if torch.cuda.is_available() else "cpu", help="训练设备") parser.add_argument("--dtype", type=str, default="bfloat16", help="混合精度类型") parser.add_argument("--num_workers", type=int, default=8, help="数据加载线程数") parser.add_argument("--accumulation_steps", type=int, default=1, help="梯度累积步数") @@ -240,11 +243,15 @@ if __name__ == "__main__": parser.add_argument("--sglang_base_url", type=str, default="http://localhost:8998", help="SGLang服务器URL") parser.add_argument("--sglang_model_path", type=str, default="../model", help="SGLang tokenizer路径") parser.add_argument("--sglang_shared_path", type=str, default="./sglang_ckpt_grpo", help="SGLang共享存储路径") + parser.add_argument("--device", + type=str, + default="cuda:0" if torch.cuda.is_available() else ("npu:0" if torch_npu and torch_npu.npu.is_available() else "cpu"), + help="训练设备") args = parser.parse_args() # ========== 1. 初始化环境和随机种子 ========== - local_rank = init_distributed_mode() - if dist.is_initialized(): args.device = f"cuda:{local_rank}" + local_rank = init_distributed_mode("nccl" if torch.cuda.is_available() else "hccl") + if dist.is_initialized(): args.device = f"cuda:{local_rank}" if torch.cuda.is_available() else f"npu:{local_rank}" setup_seed(42 + (dist.get_rank() if dist.is_initialized() else 0)) # ========== 2. 配置目录、模型参数、检查ckp ========== @@ -254,7 +261,7 @@ if __name__ == "__main__": ckp_data = lm_checkpoint(lm_config, weight=args.save_weight, save_dir='../checkpoints') if args.from_resume==1 else None # ========== 3. 设置混合精度 ========== - device_type = "cuda" if "cuda" in args.device else "cpu" + device_type = "cuda" if "cuda" in args.device else ("npu" if "npu" in args.device else "cpu") dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16 autocast_ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast(dtype=dtype) diff --git a/trainer/train_lora.py b/trainer/train_lora.py index 974bf37..ba33fc4 100644 --- a/trainer/train_lora.py +++ b/trainer/train_lora.py @@ -8,6 +8,10 @@ import argparse import time import warnings import torch +try: + import torch_npu +except: + torch_npu = None import torch.distributed as dist from contextlib import nullcontext from torch import optim, nn @@ -81,7 +85,6 @@ if __name__ == "__main__": parser.add_argument("--epochs", type=int, default=10, help="训练轮数") parser.add_argument("--batch_size", type=int, default=32, help="batch size") parser.add_argument("--learning_rate", type=float, default=1e-4, help="初始学习率") - parser.add_argument("--device", type=str, default="cuda:0" if torch.cuda.is_available() else "cpu", help="训练设备") parser.add_argument("--dtype", type=str, default="bfloat16", help="混合精度类型") parser.add_argument("--num_workers", type=int, default=8, help="数据加载线程数") parser.add_argument("--accumulation_steps", type=int, default=1, help="梯度累积步数") @@ -98,11 +101,15 @@ if __name__ == "__main__": parser.add_argument("--use_wandb", action="store_true", help="是否使用wandb") parser.add_argument("--wandb_project", type=str, default="MiniMind-LoRA", help="wandb项目名") parser.add_argument("--use_compile", default=0, type=int, choices=[0, 1], help="是否使用torch.compile加速(0=否,1=是)") + parser.add_argument("--device", + type=str, + default="cuda:0" if torch.cuda.is_available() else ("npu:0" if torch_npu and torch_npu.npu.is_available() else "cpu"), + help="训练设备") args = parser.parse_args() # ========== 1. 初始化环境和随机种子 ========== - local_rank = init_distributed_mode() - if dist.is_initialized(): args.device = f"cuda:{local_rank}" + local_rank = init_distributed_mode("nccl" if torch.cuda.is_available() else "hccl") + if dist.is_initialized(): args.device = f"cuda:{local_rank}" if torch.cuda.is_available() else f"npu:{local_rank}" setup_seed(42 + (dist.get_rank() if dist.is_initialized() else 0)) # ========== 2. 配置目录、模型参数、检查ckp ========== @@ -111,7 +118,7 @@ if __name__ == "__main__": ckp_data = lm_checkpoint(lm_config, weight=args.lora_name, save_dir='../checkpoints') if args.from_resume==1 else None # ========== 3. 设置混合精度 ========== - device_type = "cuda" if "cuda" in args.device else "cpu" + device_type = "cuda" if "cuda" in args.device else ("npu" if "npu" in args.device else "cpu") dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16 autocast_ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast(dtype=dtype) diff --git a/trainer/train_ppo.py b/trainer/train_ppo.py index 228fb68..500aac5 100644 --- a/trainer/train_ppo.py +++ b/trainer/train_ppo.py @@ -9,6 +9,10 @@ import math import re import warnings import torch +try: + import torch_npu +except: + torch_npu = None import torch.distributed as dist import torch.nn.functional as F from transformers import AutoTokenizer @@ -300,7 +304,6 @@ if __name__ == "__main__": parser.add_argument("--batch_size", type=int, default=2, help="batch size") parser.add_argument("--learning_rate", type=float, default=3e-7, help="Actor学习率") parser.add_argument("--critic_learning_rate", type=float, default=5e-7, help="Critic学习率") - parser.add_argument("--device", type=str, default="cuda:0" if torch.cuda.is_available() else "cpu", help="训练设备") parser.add_argument("--dtype", type=str, default="bfloat16", help="混合精度类型") parser.add_argument("--num_workers", type=int, default=8, help="数据加载线程数") parser.add_argument("--accumulation_steps", type=int, default=1, help="梯度累积步数") @@ -335,11 +338,15 @@ if __name__ == "__main__": parser.add_argument("--sglang_base_url", type=str, default="http://localhost:8998", help="SGLang服务器URL") parser.add_argument("--sglang_model_path", type=str, default="../model", help="SGLang tokenizer路径") parser.add_argument("--sglang_shared_path", type=str, default="./sglang_ckpt_ppo", help="SGLang共享存储路径") + parser.add_argument("--device", + type=str, + default="cuda:0" if torch.cuda.is_available() else ("npu:0" if torch_npu and torch_npu.npu.is_available() else "cpu"), + help="训练设备") args = parser.parse_args() # ========== 1. 初始化环境和随机种子 ========== - local_rank = init_distributed_mode() - if dist.is_initialized(): args.device = f"cuda:{local_rank}" + local_rank = init_distributed_mode("nccl" if torch.cuda.is_available() else "hccl") + if dist.is_initialized(): args.device = f"cuda:{local_rank}" if torch.cuda.is_available() else f"npu:{local_rank}" setup_seed(42 + (dist.get_rank() if dist.is_initialized() else 0)) # ========== 2. 配置目录、模型参数、检查ckp ========== @@ -348,7 +355,7 @@ if __name__ == "__main__": ckp_data = lm_checkpoint(lm_config, weight=args.save_weight, save_dir='../checkpoints') if args.from_resume==1 else None # ========== 3. 设置混合精度 ========== - device_type = "cuda" if "cuda" in args.device else "cpu" + device_type = "cuda" if "cuda" in args.device else ("npu" if "npu" in args.device else "cpu") dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16 autocast_ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast(dtype=dtype) diff --git a/trainer/train_pretrain.py b/trainer/train_pretrain.py index 5d33de4..19d6e2a 100644 --- a/trainer/train_pretrain.py +++ b/trainer/train_pretrain.py @@ -8,6 +8,10 @@ import argparse import time import warnings import torch +try: + import torch_npu +except: + torch_npu = None import torch.distributed as dist from contextlib import nullcontext from torch import optim, nn @@ -86,7 +90,6 @@ if __name__ == "__main__": parser.add_argument("--epochs", type=int, default=2, help="训练轮数") parser.add_argument("--batch_size", type=int, default=32, help="batch size") parser.add_argument("--learning_rate", type=float, default=5e-4, help="初始学习率") - parser.add_argument("--device", type=str, default="cuda:0" if torch.cuda.is_available() else "cpu", help="训练设备") parser.add_argument("--dtype", type=str, default="bfloat16", help="混合精度类型") parser.add_argument("--num_workers", type=int, default=8, help="数据加载线程数") parser.add_argument("--accumulation_steps", type=int, default=8, help="梯度累积步数") @@ -103,11 +106,14 @@ if __name__ == "__main__": parser.add_argument("--use_wandb", action="store_true", help="是否使用wandb") parser.add_argument("--wandb_project", type=str, default="MiniMind-Pretrain", help="wandb项目名") parser.add_argument("--use_compile", default=0, type=int, choices=[0, 1], help="是否使用torch.compile加速(0=否,1=是)") + parser.add_argument("--device", type=str, + default="cuda:0" if torch.cuda.is_available() else ("npu:0" if torch_npu and torch_npu.npu.is_available() else "cpu"), + help="训练设备") args = parser.parse_args() # ========== 1. 初始化环境和随机种子 ========== - local_rank = init_distributed_mode() - if dist.is_initialized(): args.device = f"cuda:{local_rank}" + local_rank = init_distributed_mode("nccl" if torch.cuda.is_available() else "hccl") + if dist.is_initialized(): args.device = f"cuda:{local_rank}" if torch.cuda.is_available() else f"npu:{local_rank}" setup_seed(42 + (dist.get_rank() if dist.is_initialized() else 0)) # ========== 2. 配置目录、模型参数、检查ckp ========== @@ -116,7 +122,7 @@ if __name__ == "__main__": ckp_data = lm_checkpoint(lm_config, weight=args.save_weight, save_dir='../checkpoints') if args.from_resume==1 else None # ========== 3. 设置混合精度 ========== - device_type = "cuda" if "cuda" in args.device else "cpu" + device_type = "cuda" if "cuda" in args.device else ("npu" if "npu" in args.device else "cpu") dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16 autocast_ctx = nullcontext() if device_type == "cpu" else torch.cuda.amp.autocast(dtype=dtype) diff --git a/trainer/trainer_utils.py b/trainer/trainer_utils.py index b6211d5..8689525 100644 --- a/trainer/trainer_utils.py +++ b/trainer/trainer_utils.py @@ -41,11 +41,11 @@ def get_lr(current_step, total_steps, lr): return lr*(0.1 + 0.45*(1 + math.cos(math.pi * current_step / total_steps))) -def init_distributed_mode(): +def init_distributed_mode(backend="nccl"): if int(os.environ.get("RANK", -1)) == -1: return 0 # 非DDP模式 - dist.init_process_group(backend="nccl") + dist.init_process_group(backend=backend) local_rank = int(os.environ["LOCAL_RANK"]) torch.cuda.set_device(local_rank) return local_rank