使用 DeepSpeed 微调 OPT 基础语言模型
文章目录
- OPT 基础语言模型
- Using OPT with DeepSpeed
- main.py 解析
- 1、导入库和模块
- 2、解析命令行参数
- 3、main 函数
- 3.1 设备与分布式初始化
- 3.2 模型与数据准备
- 3.3 定义评估函数
- 3.4 优化器与学习率调度器设置
- 3.5 使用 deepspeed 进行模型等初始化
- 3.6 训练循环
- 3.7 模型保存
- 4、dschat/utils 函数
- 4.1 get_train_ds_config 生成训练阶段的 deepspeed 配置字典
- 4.2 get_train_ds_config 生成训练阶段的 deepspeed 配置字典
- 复现过程
- Using OPT with Colossal-AI
- 参考资料
OPT 基础语言模型
基础语言模型 (Basic Language Model) 是指只在大规模文本语料中进行了预训练的模型,未经过指令和下游任务微调、以及人类反馈等任何对齐优化。
OPT 是由 Meta AI 研究人员发布的一系列大规模预训练语言模型,模型包括125M、350M、1.3B、2.7B、6.7B、13B、30B、66B、175B 9个不同的参数规模和版本,除了 175B 的版本需要填写申请获取外,其它规模版本的模型都完全开放下载,可以免费获得。OPT-175B 和 GPT-3 的性能相当,并且部署只需要损耗 GPT-3 1/7 的能量损耗。OPT 系列模型开源的目的是为促进学术研究和交流,因为绝大多数大语言模型训练成本高昂,导致大部分研究人员都无法负担大语言模型的训练或使用;同时,各大企业发布的大语言预训练模型由于商业目的也都无法完整访问模型权重,只能通过 API 调用获取结果,阻碍了学术的交流与研究。
Using OPT with DeepSpeed
DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning
目录结构
├── evaluation_scripts // 脚本用于运行模型的评估
│ └── run_prompt.sh
├── main.py // 训练的主脚本
├── prompt_eval.py // 与 run_prompt.sh 搭配使用
├── README.md
├── training_log_output // 训练过程的日志文件
│ └── opt-1.3b-globalBatchSize128.log
└── training_scripts├── llama2 // 用于微调 LLaMA 2 模型│ ├── run_llama2_7b_lora.sh│ └── run_llama2_7b.sh├── opt // 用于微调 OPT 模型│ ├── multi_node│ │ └── run_66b.sh│ ├── single_gpu│ │ ├── run_1.3b.sh│ │ └── run_6.7b_lora.sh│ └── single_node│ ├── run_1.3b_lora.sh│ ├── run_13b.sh│ ├── run_1.3b.sh│ ├── run_30b_lora.sh│ ├── run_6.7b.sh│ └── sweep // 用于超参数搜索│ ├── README.md│ ├── run_single.sh│ └── run_step1_sweep.sh├── other_language // 用于支持其他语言的模型训练│ ├── run_chinese.sh│ └── run_japanese.sh└── README.md
main.py 解析
位置:
DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning/main.py
1、导入库和模块
import argparse
import math
import timeimport torch
from torch.utils.data import DataLoader, RandomSampler, SequentialSampler
from torch.utils.data.distributed import DistributedSamplerfrom transformers import (AutoModelForCausalLM,SchedulerType,default_data_collator,get_scheduler,
)import deepspeed
from deepspeed.ops.adam import DeepSpeedCPUAdam, FusedAdam
from deepspeed import get_acceleratorfrom dschat.utils.data.data_utils import create_prompt_dataset
from dschat.utils.utils import print_rank_0, to_device, save_hf_format, set_random_seed, get_all_reduce_mean, get_optimizer_grouped_parameters, save_zero_three_model, load_hf_tokenizer
from dschat.utils.ds_utils import get_train_ds_config
from dschat.utils.module.lora import convert_linear_layer_to_lora, convert_lora_to_linear_layer, only_optimize_lora_parameters, make_model_gradient_checkpointing_compatible
from dschat.utils.model.model_utils import create_hf_model, causal_lm_model_to_fp32_loss
from dschat.utils.perf import print_throughput
2、解析命令行参数
def parse_args():parser = argparse.ArgumentParser(description="Finetune a transformers model on a causal language modeling task")parser.add_argument('--data_path',nargs='*',default=['Dahoas/rm-static'],help='Path to the training dataset. Accepted format:''1) a single data path, 2) multiple datasets in the''form: dataset1-path dataset2-path ...')parser.add_argument('--data_split',type=str,default='2,4,4',help='Comma-separated list of proportions for training''phase 1, 2, and 3 data. For example the split `6,2,2`''will use 60%% of data for phase 1, 20%% for phase 2''and 20%% for phase 3.')parser.add_argument('--sft_only_data_path',nargs='*',default=[],help='Path to the dataset for only using in SFT phase.')parser.add_argument('--data_output_path',type=str,default='/tmp/data_files/',help='Where to store the data-related files such as shuffle index. This needs to be on a local storage of a node (not on a shared storage)')parser.add_argument("--model_name_or_path",type=str,help="Path to pretrained model or model identifier from huggingface.co/models.",required=True,)parser.add_argument("--per_device_train_batch_size",type=int,default=16,help="Batch size (per device) for the training dataloader.",)parser.add_argument("--per_device_eval_batch_size",type=int,default=16,help="Batch size (per device) for the evaluation dataloader.",)parser.add_argument("--max_seq_len",type=int,default=512,help="The maximum sequence length.",)parser.add_argument("--learning_rate",type=float,default=1e-3,help="Initial learning rate (after the potential warmup period) to use.",)parser.add_argument("--weight_decay",type=float,default=0.,help="Weight decay to use.")parser.add_argument("--num_train_epochs",type=int,default=1,help="Total number of training epochs to perform.")parser.add_argument("--gradient_accumulation_steps",type=int,default=1,help="Number of updates steps to accumulate before performing a backward/update pass.",)parser.add_argument("--lr_scheduler_type",type=SchedulerType,default="cosine",help="The scheduler type to use.",choices=["linear", "cosine", "cosine_with_restarts", "polynomial","constant", "constant_with_warmup"],)parser.add_argument("--num_warmup_steps",type=int,default=0,help="Number of steps for the warmup in the lr scheduler.")parser.add_argument("--output_dir",type=str,default=None,help="Where to store the model.")parser.add_argument("--seed",type=int,default=1234,help="A seed for reproducible training.")parser.add_argument("--local_rank",type=int,default=-1,help="local_rank for distributed training on gpus")parser.add_argument('--gradient_checkpointing',action='store_true',help='Enable HF gradient checkpointing for model.')parser.add_argument("--dropout",type=float,default=None,help="If dropout configured, use it. ""Otherwise, keep the default dropout configuration of the model.")# deepspeed featuresparser.add_argument('--offload',action='store_true',help='Enable ZeRO Offload techniques.')parser.add_argument('--dtype',type=str,default='fp16',choices=['fp16', 'bf16'],help='Training data type')parser.add_argument('--zero_stage',type=int,default=0,help='ZeRO optimization stage for Actor model (and clones).')## LoRA for efficient training settingparser.add_argument("--lora_dim",type=int,default=0,help="If > 0, use LoRA for efficient training.")parser.add_argument("--lora_module_name",type=str,default="decoder.layers.",help="The scope of LoRA.")parser.add_argument('--only_optimize_lora',action='store_true',help='Only optimize the LoRA parameters.')parser.add_argument("--lora_learning_rate",type=float,default=5e-4,help="Initial LoRA learning rate (after the potential warmup period) to use.")## low precisionparser.add_argument('--compute_fp32_loss',action='store_true',help='Relevant for low precision dtypes (fp16, bf16, etc.). ''If specified, loss is calculated in fp32.')## Tensorboard loggingparser.add_argument('--enable_tensorboard',action='store_true',help='Enable tensorboard logging')parser.add_argument('--tensorboard_path',type=str,default="step1_tensorboard")## Tokenizerparser.add_argument("--add_eot_token",action='store_true',help="Add `eot_token` as additional special token to tokenizer")parser.add_argument("--eot_token",type=str,default="<|endoftext|>",help="Specify the format of the `eot_token`",)## Print lossparser.add_argument('--print_loss',action='store_true',help='Prints loss at each step.')parser = deepspeed.add_config_arguments(parser)args = parser.parse_args()return args
部分命令行参数含义:
Name | Description |
---|---|
data_path | 指定训练数据集路径,可以是单个路径或多个路径。 |
data_split | 逗号分隔的比例,用于划分数据为阶段 1、2 和 3 的训练数据。 |
model_name_or_path | 指定预训练模型路径 |
per_device_train_batch_size | 每个设备的训练数据批大小 |
per_device_eval_batch_size | 每个设备的验证数据批大小 |
max_seq_len | 训练时的最大序列长度,较长的序列可能消耗更多显存 |
learning_rate | 初始学习率 |
weight_decay | 权重衰减值 |
num_train_epochs | 训练的总轮数 |
gradient_accumulation_steps | 反向传播/更新之前累计的步数,用于模拟更大的批大小。 |
lr_scheduler_type | 学习率调度器类型 |
num_warmup_steps | 学习率预热的步数 |
seed | 随机数种子 |
zero_stage | 指定 DeepSpeed ZeRO 优化阶段 |
lora_dim | LoRA 的低秩矩阵维度。如果大于 0,则启用 LoRA 高效训练。 |
lora_module_name | 指定应用 LoRA 的模块范围 |
only_optimize_lora | 仅优化 LoRA 参数,不优化模型的其他参数。 |
gradient_checkpointing | 启用梯度检查点,降低显存占用。 |
deepspeed | 启用 DeepSpeed 训练框架 |
enable_tensorboard | 启用 TensorBoard,用于训练监控和可视化 |
tensorboard_path | 指定 TensorBoard 的日志保存路径 |
output_dir | 指定模型训练输出文件的保存路径 |
有些资料说,
only_optimize_lora
和gradient_checkpointing
不能同时开,试了一下,训练可以跑起来,但不知道会不会影响效果。如果确实不能同时开,可以在return args
前加一个判断语句,增强鲁棒性。
3、main 函数
3.1 设备与分布式初始化
args = parse_args()# 如果args.local_rank为 -1,表示不是分布式训练场景if args.local_rank == -1:device = torch.device(get_accelerator().device_name())else:get_accelerator().set_device(args.local_rank)device = torch.device(get_accelerator().device_name(), args.local_rank)# Initializes the distributed backend which will take care of sychronizing nodes/GPUs# torch.distributed.init_process_group(backend='nccl')deepspeed.init_distributed()args.global_rank = torch.distributed.get_rank()# from dschat.utils.ds_utils import get_train_ds_config# 生成 deepspeed 训练的配置字典ds_config = get_train_ds_config(offload=args.offload,dtype=args.dtype,stage=args.zero_stage,enable_tensorboard=args.enable_tensorboard,tb_path=args.tensorboard_path,tb_name="step1_model")ds_config['train_micro_batch_size_per_gpu'] = args.per_device_train_batch_sizeds_config['train_batch_size'] = args.per_device_train_batch_size * torch.distributed.get_world_size() * args.gradient_accumulation_steps# If passed along, set the training seed now.# 设置训练的随机种子set_random_seed(args.seed)torch.distributed.barrier()
3.2 模型与数据准备
# load_hf_tokenizer will get the correct tokenizer and set padding tokens based on the model family# 加载 tokenizeradditional_special_tokens = args.eot_token if args.add_eot_token else Nonetokenizer = load_hf_tokenizer(args.model_name_or_path,fast_tokenizer=True,add_special_tokens=additional_special_tokens)# 模型的初始化构建model = create_hf_model(AutoModelForCausalLM,args.model_name_or_path,tokenizer,ds_config,dropout=args.dropout)if args.compute_fp32_loss:print_rank_0(f"Using model {model.__class__.__name__} with loss in fp32",args.global_rank)causal_lm_model_to_fp32_loss(model)# 如果 args.lora_dim 大于 0,启用 LoRA(低秩自适应)进行高效训练if args.lora_dim > 0:model = convert_linear_layer_to_lora(model, args.lora_module_name,args.lora_dim)if args.only_optimize_lora:model = only_optimize_lora_parameters(model)model = make_model_gradient_checkpointing_compatible(model)# Prepare the data# 数据集准备train_phase = 1train_dataset, eval_dataset = create_prompt_dataset(args.local_rank,args.data_path,args.data_split,args.data_output_path,train_phase,args.seed,tokenizer,args.max_seq_len,end_of_conversation_token=tokenizer.eos_token,sft_only_data_path=args.sft_only_data_path)# DataLoaders creation:# 数据加载器创建if args.local_rank == -1:train_sampler = RandomSampler(train_dataset)eval_sampler = SequentialSampler(eval_dataset)else:train_sampler = DistributedSampler(train_dataset)eval_sampler = DistributedSampler(eval_dataset)train_dataloader = DataLoader(train_dataset,collate_fn=default_data_collator,sampler=train_sampler,batch_size=args.per_device_train_batch_size)eval_dataloader = DataLoader(eval_dataset,collate_fn=default_data_collator,sampler=eval_sampler,batch_size=args.per_device_eval_batch_size)
3.3 定义评估函数
def evaluation(model, eval_dataloader):model.eval()losses = 0for step, batch in enumerate(eval_dataloader):batch = to_device(batch, device)with torch.no_grad():outputs = model(**batch)loss = outputs.losslosses += loss.float()losses = losses / (step + 1)try:losses = get_all_reduce_mean(losses)except:passtry:perplexity = torch.exp(losses).item()except OverflowError:perplexity = float("inf")return perplexity, losses.item()
3.4 优化器与学习率调度器设置
# Split weights in two groups, one with weight decay and the other not.optimizer_grouped_parameters = get_optimizer_grouped_parameters(model, args.weight_decay, args.lora_learning_rate)AdamOptimizer = DeepSpeedCPUAdam if args.offload else FusedAdamoptimizer = AdamOptimizer(optimizer_grouped_parameters,lr=args.learning_rate,betas=(0.9, 0.95))num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)lr_scheduler = get_scheduler(name=args.lr_scheduler_type,optimizer=optimizer,num_warmup_steps=args.num_warmup_steps,num_training_steps=args.num_train_epochs * num_update_steps_per_epoch,)
3.5 使用 deepspeed 进行模型等初始化
model, optimizer, _, lr_scheduler = deepspeed.initialize(model=model,optimizer=optimizer,args=args,config=ds_config,lr_scheduler=lr_scheduler,dist_init_required=True)# 开启模型的梯度检查点功能if args.gradient_checkpointing:model.gradient_checkpointing_enable()
3.6 训练循环
# Train!print_rank_0("***** Running training *****", args.global_rank)print_rank_0(f"***** Evaluating perplexity, Epoch {0}/{args.num_train_epochs} *****",args.global_rank)# 观察模型在未训练时在验证集上的表现情况perplexity, eval_loss = evaluation(model, eval_dataloader)print_rank_0(f"ppl: {perplexity}, loss: {eval_loss}", args.global_rank)# 外层 for 循环,每一轮代表一次完整遍历训练数据集的过程for epoch in range(args.num_train_epochs):print_rank_0(f"Beginning of Epoch {epoch+1}/{args.num_train_epochs}, Total Micro Batches {len(train_dataloader)}",args.global_rank)# 将模型切换到训练模式model.train()# 内层 for 循环,用于遍历训练数据加载器中的每个批次数据for step, batch in enumerate(train_dataloader):# 先记录当前时间,用于后续计算该批次数据处理的耗时start = time.time()batch = to_device(batch, device)# 前向传播outputs = model(**batch, use_cache=False)loss = outputs.lossif args.print_loss:print(f"Epoch: {epoch}, Step: {step}, Rank: {torch.distributed.get_rank()}, loss = {loss}")# 反向传播model.backward(loss)# 更新模型参数model.step()# 完成一个批次数据的训练流程,记录结束时间end = time.time()if torch.distributed.get_rank() == 0:# 打印训练吞吐量print_throughput(model.model, args, end - start,args.global_rank)# Evaluate perplexity on the validation set.# 观察模型在验证集上的性能变化情况print_rank_0(f"***** Evaluating perplexity, Epoch {epoch+1}/{args.num_train_epochs} *****",args.global_rank)perplexity, eval_loss = evaluation(model, eval_dataloader)print_rank_0(f"ppl: {perplexity}, loss: {eval_loss}", args.global_rank)model.tput_timer.update_epoch_count()
3.7 模型保存
if args.output_dir is not None:print_rank_0('saving the final model ...', args.global_rank)model = convert_lora_to_linear_layer(model)if args.global_rank == 0:save_hf_format(model, tokenizer, args)if args.zero_stage == 3:# For zero stage 3, each gpu only has a part of the model, so we need a special save functionsave_zero_three_model(model,args.global_rank,args.output_dir,zero_stage=args.zero_stage)
4、dschat/utils 函数
4.1 get_train_ds_config 生成训练阶段的 deepspeed 配置字典
# applications/DeepSpeed-Chat/dschat/utils/ds_utils.py
def get_train_ds_config(offload,dtype,stage=2,enable_hybrid_engine=False,inference_tp_size=1,release_inference_cache=False,pin_parameters=True,tp_gather_partition_size=8,max_out_tokens=512,enable_tensorboard=False,enable_mixed_precision_lora=False,tb_path="",tb_name=""):# 如果 offload 为 True,则将 device 设置为 "cpu",卸载到 CPU 设备device = "cpu" if offload else "none"if dtype == "fp16":data_type = "fp16"dtype_config = {"enabled": True, "loss_scale_window": 100}elif dtype == "bf16":data_type = "bfloat16"dtype_config = {"enabled": True}# 存储 ZeRO 优化相关的配置信息zero_opt_dict = {"stage": stage, # 设置 ZeRO 优化阶段"overlap_comm": True, # 启用通信重叠# 将模型参数和优化器相关的数据卸载到指定的设备"offload_param": {"device": device},"offload_optimizer": {"device": device},"stage3_param_persistence_threshold": 1e4,"stage3_max_live_parameters": 3e7,"stage3_prefetch_bucket_size": 3e7,"memory_efficient_linear": False}# 混合精度 LoRA 相关配置部分if enable_mixed_precision_lora:zero_opt_dict["zero_quantized_nontrainable_weights"] = Trueif dist.get_world_size() != get_accelerator().device_count():zero_opt_dict["zero_hpz_partition_size"] = get_accelerator().device_count()# 返回配置字典,包含完整的训练阶段 deepspeed 配置信息return {"train_batch_size": GLOBAL_BATCH_SIZE,"train_micro_batch_size_per_gpu": MICRO_BATCH_SIZE,"steps_per_print": 10,"zero_optimization": zero_opt_dict,data_type: dtype_config,"gradient_clipping": 1.0,"prescale_gradients": False,"wall_clock_breakdown": False,"hybrid_engine": {"enabled": enable_hybrid_engine,"max_out_tokens": max_out_tokens,"inference_tp_size": inference_tp_size,"release_inference_cache": release_inference_cache,"pin_parameters": pin_parameters,"tp_gather_partition_size": tp_gather_partition_size,},"tensorboard": {"enabled": enable_tensorboard,"output_path": f"{tb_path}/ds_tensorboard_logs/","job_name": f"{tb_name}_tensorboard"}}
4.2 get_train_ds_config 生成训练阶段的 deepspeed 配置字典
# applications/DeepSpeed-Chat/dschat/utils/perf.py
# This function can be used to print throughput for Step 1 and 2 only
def print_throughput(hf_model, args, e2e_time, rank=0):if rank <= 0:hf_config = hf_model.confignum_layers, hidden_size, vocab_size = get_hf_configs(hf_config)gpus_per_model = torch.distributed.get_world_size()seq_length = args.max_seq_lenbatch_size = args.per_device_train_batch_size# 计算每秒处理样本数samples_per_second = batch_size / e2e_timecheckpoint_activations_factor = 4 if args.gradient_checkpointing else 3if args.lora_dim > 0:k = args.lora_dim * 2 / hidden_sizecheckpoint_activations_factor -= (1 - k)# 计算模型参数数量hf_model._num_params = sum([p.ds_numel if hasattr(p, "ds_tensor") else p.numel()for p in hf_model.parameters()])# 换算为以十亿为单位params_in_billions = hf_model._num_params / (1e9)# Megatron paper's formula to calculate training flopstrain_flops_per_iteration = calculate_flops(checkpoint_activations_factor, batch_size, seq_length, hf_config)# 计算训练的每秒浮点运算次数train_tflops = train_flops_per_iteration / (e2e_time * gpus_per_model *(10**12))param_string = f"{params_in_billions:.3f} B" if params_in_billions != 0 else "NA"# 格式化输出性能指标信息# - 模型参数数量# - 端到端训练的延迟时间# - 每秒浮点运算次数# - 每秒处理的样本数# - 每个样本的处理时间# - 批次大小# - 序列长度print(f"Model Parameters: {param_string}, Latency: {e2e_time:.2f}s, TFLOPs: {train_tflops:.2f}, Samples/sec: {samples_per_second:.2f}, Time/seq {e2e_time/batch_size:.2f}s, Batch Size: {batch_size}, Sequence Length: {seq_length}")
复现过程
1、实验环境。
cat /etc/issue | Ubuntu 22.04.4 LTS
nvidia-smi | NVIDIA GeForce RTX 2080 Ti
nvcc -V | cuda_11.7
2、下载代码,进入目录。
git clone https://github.com/microsoft/DeepSpeedExamples.git
cd DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning
3、下载模型,保存在step1_supervised_finetuning
目录下。
Model | Parameters | Pretrained weights | HF-Mirror |
---|---|---|---|
OPT-125M | 125M | facebook/opt-125m | facebook/opt-125m |
OPT-350M | 350M | facebook/opt-350m | facebook/opt-350m |
OPT-1.3B | 1.3B | facebook/opt-1.3b | facebook/opt-1.3b |
下载如下内容即可
4、下载数据集,保存在step1_supervised_finetuning
目录下。
Name | Address | HF-Mirror |
---|---|---|
Dahoas/rm-static | Dahoas/rm-static | Dahoas/rm-static |
Dahoas/full-hh-rlhf | Dahoas/full-hh-rlhf | Dahoas/full-hh-rlhf |
Dahoas/synthetic-instruct-gptj-pairwise | Dahoas/synthetic-instruct-gptj-pairwise | Dahoas/synthetic-instruct-gptj-pairwise |
yitingxie/rlhf-reward-datasets | yitingxie/rlhf-reward-datasets | yitingxie/rlhf-reward-datasets |
5、创建 conda 虚拟环境,安装依赖。
conda create -n torch_2.1.0 python=3.8
conda activate torch_2.1.0
conda install pytorch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 pytorch-cuda=11.8 -c pytorch -c nvidia
pip install datasets>=2.8.0 sentencepiece>=0.1.97 protobuf==3.20.3 accelerate>=0.15.0 deepspeed>=0.9.0 transformers>=4.31.0,!=4.33.2 tensorboard
6、创建测试脚本。
路径:
applications/DeepSpeed-Chat/training/step1_supervised_finetuning/training_scripts/my_test/run_opt-125m.sh
#!/bin/bashOUTPUT_PATH=./output
mkdir -p $OUTPUT_PATHdeepspeed main.py \--data_path Dahoas/rm-static Dahoas/full-hh-rlhf Dahoas/synthetic-instruct-gptj-pairwise yitingxie/rlhf-reward-datasets \--data_split 2,4,4 \--model_name_or_path facebook/opt-125m \--per_device_train_batch_size 1 \--per_device_eval_batch_size 1 \--max_seq_len 512 \--learning_rate 1e-3 \--weight_decay 0. \--num_train_epochs 16 \--gradient_accumulation_steps 1 \--lr_scheduler_type cosine \--num_warmup_steps 0 \--seed 1234 \--gradient_checkpointing \--zero_stage 3 \--lora_dim 128 \--lora_module_name decoder.layers. \--deepspeed \--output_dir $OUTPUT_PATH \&> $OUTPUT_PATH/training.log
给新创建的脚本赋予执行权限:chmod +x run_opt-125m.sh
7、将applications/DeepSpeed-Chat
下的dschat
文件夹移动到applications/DeepSpeed-Chat/training
下。
当前applications/DeepSpeed-Chat/training
的文件目录结构:
├── dschat
│ ├── utils
│ ├── data
│ │ ├── data_utils.py
│ │ └── raw_datasets.py
│ ├── ds_utils.py
│ ├── model
│ │ ├── model_utils.py
│ │ └── reward_model.py
│ ├── module
│ │ └── lora.py
│ ├── perf.py
│ └── utils.py
├── step1_supervised_finetuning
│ ├── Dahoas
│ │ ├── full-hh-rlhf
│ │ │ ├── data
│ │ │ │ ├── test-00000-of-00001-ec71e9262143a91c.parquet
│ │ │ │ └── train-00000-of-00001-8349d0765e6718df.parquet
│ │ │ └── dataset_infos.json
│ │ ├── rm-static
│ │ │ ├── data
│ │ │ │ ├── test-00000-of-00001-8c7c51afc6d45980.parquet
│ │ │ │ └── train-00000-of-00001-2a1df75c6bce91ab.parquet
│ │ │ └── dataset_infos.json
│ │ └── synthetic-instruct-gptj-pairwise
│ │ ├── data
│ │ │ └── train-00000-of-00001-1e5d57b93c448e7a.parquet
│ │ └── dataset_infos.json
│ ├── facebook
│ │ ├── opt-125m
│ │ │ ├── config.json
│ │ │ ├── generation_config.json
│ │ │ ├── merges.txt
│ │ │ ├── pytorch_model.bin
│ │ │ ├── special_tokens_map.json
│ │ │ ├── tokenizer_config.json
│ │ │ └── vocab.json
│ │ ├── opt-1.3b
│ │ │ ├── config.json
│ │ │ ├── generation_config.json
│ │ │ ├── merges.txt
│ │ │ ├── pytorch_model.bin
│ │ │ ├── special_tokens_map.json
│ │ │ ├── tokenizer_config.json
│ │ │ └── vocab.json
│ │ └── opt-350m
│ │ ├── config.json
│ │ ├── generation_config.json
│ │ ├── merges.txt
│ │ ├── pytorch_model.bin
│ │ ├── special_tokens_map.json
│ │ ├── tokenizer_config.json
│ │ └── vocab.json
│ ├── main.py
│ ├── README.md
│ ├── training_log_output
│ │ └── opt-1.3b-globalBatchSize128.log
│ ├── training_scripts
│ │ ├── llama2
│ │ │ ├── run_llama2_7b_lora.sh
│ │ │ └── run_llama2_7b.sh
│ │ ├── my_test
│ │ │ └── run_opt-125m.sh
│ │ ├── opt
│ │ │ ├── single_gpu
│ │ │ │ ├── run_1.3b.sh
│ │ │ │ └── run_6.7b_lora.sh
│ │ │ └── single_node
│ │ │ ├── run_1.3b_lora.sh
│ │ │ ├── run_13b.sh
│ │ │ ├── run_1.3b.sh
│ │ │ ├── run_30b_lora.sh
│ │ │ ├── run_6.7b.sh
│ │ │ └── sweep
│ │ │ ├── README.md
│ │ │ ├── run_single.sh
│ │ │ └── run_step1_sweep.sh
│ │ ├── other_language
│ │ │ ├── run_chinese.sh
│ │ │ └── run_japanese.sh
│ │ └── README.md
│ └── yitingxie
│ └── rlhf-reward-datasets
│ └── data
│ ├── test-00000-of-00001-955c146ec7a10a1e.parquet
│ └── train-00000-of-00001-2ea3039ca4da89f8.parquet
8、在main.py
中加入如下代码,使其能找到导入的dschat
模块。
import sys
import ossys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
9、在applications/DeepSpeed-Chat/training/step1_supervised_finetuning
目录下运行脚本。
bash training_scripts/my_test/run_opt-125m.sh
遇到一个报错:FileNotFoundError: Directory Dahoas/rm-static is neither a dataset directory nor a dataset dict directory.
,经过排查,是applications/DeepSpeed-Chat/training/dschat/utils/data/raw_datasets.py
的问题。
class PromptRawDataset(object):def __init__(self, output_path, seed, local_rank, dataset_name):self.output_path = output_pathself.seed = seedself.local_rank = local_rankif os.path.exists(dataset_name):# self.raw_datasets = load_from_disk(dataset_name)# 注释掉上面这条语句,这里也直接改用 load_dataset(dataset_name)self.raw_datasets = load_dataset(dataset_name)elif not dataset_name == 'local/jsonfile':self.raw_datasets = load_dataset(dataset_name)
参考:
- mariosasko 的回答1
- mariosasko 的回答2
- Arunbh Yashaswi 的回答
- 【huggingface】数据集及模型下载并保存至本地
Using OPT with Colossal-AI
待研究:https://github.com/hpcaitech/ColossalAI#OPT
参考资料
- guolipa:大语言模型调研汇总
- 罗小黑:1-7B开源小模型整理汇总
- facebookresearch:About OPT & Pretrained Model Weights
- Microsoft:DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
- just_sort:DeepSpeed-Chat 打造类ChatGPT全流程 笔记一
- just_sort:DeepSpeed-Chat 打造类ChatGPT全流程 笔记二之监督指令微调
- AI开发者:专题:大模型训练入门实战
- J.P.Liu:DeepSpeed-Chat全流程训练实战
相关文章:
使用 DeepSpeed 微调 OPT 基础语言模型
文章目录 OPT 基础语言模型Using OPT with DeepSpeedmain.py 解析1、导入库和模块2、解析命令行参数3、main 函数3.1 设备与分布式初始化3.2 模型与数据准备3.3 定义评估函数3.4 优化器与学习率调度器设置3.5 使用 deepspeed 进行模型等初始化3.6 训练循环3.7 模型保存 4、dsch…...
DPDK用户态协议栈-TCP Posix API 2
tcp posix api send发送 ssize_t nsend(int sockfd, const void *buf, size_t len, __attribute__((unused))int flags) {ssize_t length 0;void* hostinfo get_host_fromfd(sockfd);if (hostinfo NULL) {return -1;}struct ln_tcp_stream* stream (struct ln_tcp_stream…...
打造微信小程序中的视频播放交互体验:videoUI组件库实战
本文还有配套的精品资源,点击获取 简介:本项目介绍如何利用 videoUI 组件库在微信小程序中实现视频切换播放和全屏播放功能。涵盖微信小程序开发基础、 <video> 组件使用、视频切换逻辑、全屏播放实现以及 videoUI 库的应用。为开发者提供…...
Django REST framework(DRF)在处理不同请求方法时的完整流程
文章目录 一、POST 请求创建对象的流程二、GET 请求获取对象列表的流程三、GET 请求获取单个对象的流程四、PUT/PATCH 请求更新对象的流程五、自定义方法的流程自定义 GET 方法自定义 POST 方法 一、POST 请求创建对象的流程 请求到达视图层 方法调用: dispatch说明…...
【Hive】-- hive 3.1.3 伪分布式部署(单节点)
1、环境准备 1.1、版本选择 apache hive 3.1.3 apache hadoop 3.1.0 oracle jdk 1.8 mysql 8.0.15 操作系统:Mac os 10.151.2、软件下载 https://archive.apache.org/dist/hive/ https://archive.apache.org/dist/hadoop/ 1.3、解压 tar -zxvf apache-hive-4.0.0-bin.tar…...
unity 雷达
unity 雷达 首先去商店下载TouchScript插件 导入的时候勾选Enable TUIO 然后把预制体Cursors和TouchManager拖上 最后把TuioInput这个脚本挂上 脚本上的端口号尽量不改...
Visual Studio 2022 安装和管理 GitHub Copilot
🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...
Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…...
利用notepad++删除特定关键字所在的行
1、按组合键Ctrl H,查找模式选择 ‘正则表达式’,不选 ‘.匹配新行’ 2、查找目标输入 : ^.*关键字.*\r\n (不保留空行) ^.*关键字.*$ (保留空行)3、替换为:(空) 配置界面参考下图: …...
Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值
MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB,我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上,包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户,…...
FFmpeg 实战解复用与复用
FFmpeg FFmpeg 是一个功能强大、广泛使用的多媒体处理工具,可以处理音频、视频、字幕以及多种容器格式的操作。它支持解码、编码、复用、解复用、流式传输、过滤等功能。以下是关于 FFmpeg 的一些核心信息和操作说明: 核心组件 FFmpeg 是由以下几个主要库组成的: libavcode…...
数据结构(顺序表)JAVA方法的介绍
前言 在 Java 中,集合类(Collections)是构建高效程序的核心组件之一,而 List 接口作为集合框架中的重要一员,是一个有序、可重复的元素集合。与 Set 接口不同,List 保证了元素的顺序性,并允许存…...
电商商品详情API接口(item get)数据分析上货
电商商品详情API接口(item get)在数据分析与商品上货方面发挥着重要作用。以下是对这两个方面的详细探讨: 一、数据分析 数据源获取: 商品详情API接口提供了丰富的数据源,包括商品的标题、价格、库存、描述、图片、用…...
supervisor使用详解
0、介绍 supervisor 是一个用 Python 编写的客户端/服务器系统,它允许用户在类 UNIX 操作系统(如 Linux)上监控和控制进程。supervisor 并不是一个分布式调度框架,而是一个进程管理工具,它可以用来启动、停止和重启程…...
结合开源低代码-microi吾码 阿里云建桶,以及minio文件转移阿里云oss
前言 最近在工作中,碰到一开始一个小程序的照片和视频都放在公司的minio服务器上存储。但日积月累的,而且这个客户的访问量也大,照片和视频每天的存储空间也很大,这每天也是比不菲的费用,而且也会加慢后台的访问速度。…...
如何为IntelliJ IDEA配置JVM参数
在使用IntelliJ IDEA进行Java开发时,合理配置JVM参数对于优化项目性能和资源管理至关重要。IntelliJ IDEA提供了两种方便的方式来设置JVM参数,以确保你的应用程序能够在最佳状态下运行。本文将详细介绍这两种方法:通过工具栏编辑配置和通过服…...
关于SQL注入的面试题及经验分享
Q:简述数据库的存储引擎 A:数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不…...
ISP(Image Signal Processor)——HDR技术总结
传统多帧融合技术 拍摄一系列不同曝光时长的图像帧(LDR),然后使用融合算法进行融合成HDR图像。 融合算法可以分为两种 基于照度图估计的融合 基于照度估计需要拟合相机响应函数,详细可以参考如下论文: Recovering H…...
Python字符串及正则表达式(十):字符串常用操作、字符串编码转换
前言:在编程的世界里,字符串无处不在。它们是构建用户界面、存储数据、进行通信的基础元素。无论是财务系统的总账报表、电子游戏的比赛结果,还是火车站的列车时刻表,这些信息最终都需要以文本的形式呈现给用户。这些文本的背后&a…...
测试工程师八股文04|计算机网络 和 其他
一、计算机网络 1、http和https的区别 HTTP和HTTPS是用于在互联网上传输数据的协议。它们都是应用层协议,建立在TCP/IP协议栈之上,用于客户端(如浏览器)和服务器之间的通信。 ①http和https的主要区别在于安全性。http是一种明…...
Codeforces Global Round 27的C题
题目大意 给定一个n,n>5 ans0 ans&a1|a2&a3|a4&a5...an,数组a是一个排列 下标是奇数让ans对其进行&操作,否则进行|操作,求ans能达到的最大值. 分奇偶来讨论,在n为奇数的情况下,最后一次操作是|,在n为偶数的情况下,最后一次操作是&. n二进制最高位的计算…...
【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】
👨🎓博主简介 🏅CSDN博客专家 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入!…...
第36次CCF计算机软件能力认证 梦境巡查
梦境巡查 刷新 时间限制: 1.0 秒 空间限制: 512 MiB 相关文件: 题目目录 题目背景 传说每当月光遍布西西艾弗岛,总有一道身影默默守护着居民们的美梦。 题目描述 梦境中的西西艾弗岛由 �1n1 个区域组成。梦境…...
[机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)
AdaBoost AdaBoost(Adaptive Boosting)是一种Boosting算法,它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高分类性能。 AdaBoost算法的特点是它能够自适应地调整样本的权重,使那些被错误分类的样本在后续的训练中得到…...
传统零售商商业升级的核心动机及与互联网业务融合的探索——以 AI 智能名片 S2B2C 商城小程序源码为例
摘要:本文旨在探讨传统零售商尝试商业升级的核心动机,并以 AI 智能名片 S2B2C 商城小程序源码为典型案例,分析互联网业务模式如何助力传统零售商转型。通过剖析传统零售增长模式的局限以及互联网业务在增长速度、迭代试错和用户需求洞察方面的…...
飞牛 fnos docker镜像部署OpenSpeedtest宽带网速测试教程
penSpeedTest是一个跨平台的网络测速应用,支持不同操作系统的浏览器,无需安装额外软件或插件。您可以在iPhone、iPad、Android设备、Windows和Linux系统的电脑、手机和平板上直接测试设备与NAS之间的宽带速度。 通过这个可以排查出设备与NAS之间的传输速…...
【C++】list
OK,最近浅浅学习了STL的list,有兴趣不妨垂阅! 目录 1.constructor 2.assign 3.insert 4.erase 5. reverse 6.swap 7.merge 8.unique 9.splice 10.小知识 同样的,使用list 需要包含一个头文件<list>。<list&g…...
keepalive的高可用集群
一、keepalived概述 1.keepalive的工作原理 keepalive是专门为了lvs集群开发出来的,但是适用场景不仅仅局限于lvs。而且keepalive为后台的真实服务器做了一个健康检查,当服务不可用时,会自动的移除ipvs的转发策略,服务恢复时&…...
HTTP 协议报文结构 | 返回状态码详解
注:本文为 “HTTP 历史 | 协议报文结构 | 返回状态码” 相关文章合辑。 未整理去重。 HTTP 历史 wangjunliang 最后更新: 2024/3/16 上午10:29 超文本传输协议(英语:HyperTextTransferProtocol,缩写:HTTP)是 万维网(World Wide Web)的基础协议。自 蒂姆…...
如何保证开源AI呼入机器人和AI呼出机器人的服务质量?
如何保证开源AI呼入机器人和AI呼出机器人的服务质量? 确保开源AI呼入机器人和AI呼出机器人的服务质量是企业成功部署这些智能系统的关键。高质量的服务不仅能够提高客户满意度,还能增强企业的市场竞争力。以下是实现这一目标的几个关键策略和技术措施&a…...
C++day7
#include <iostream>using namespace std; template <class T> class mylist{ public:struct Link{T val;Link* next;Link* front;};//增void insert(T val);//删void remove(T val);//改mylist& operator[](int index);//排序void Sort();//遍历void show();/…...
docker搭建Redis集群及哨兵(windows10环境,OSS Cluster)
一、基本概念 Redis:即 "Remote DIctionary Server" ,翻译为“远程字典服务器”。从字面意义上讲,它指的是一个远程的字典服务,意味着它是一个可以远程访问的服务,主要用于存储键值对(key-value pairs&…...
第8章 搬移特性
8.1 搬移函数 模块化是优秀软件设计的核心所在,好的模块化能够让我在修改程序时只需理解程序的一小部分。为了设计出高度模块化的程序,我得保证互相关联的软件要素都能集中到一块,并确保块与块之间的联系易于查找、直观易懂。同时,…...
[IT项目管理]项目时间管理(本章节3w字爆肝)
七.项目时间管理 7.1 项目进度的重要性 为什么要重视项目进度:在项目进行的过程之中会遇到变故。但是不论项目中发生了什么,时间总是在流逝,就可能会导致项目不可以在规定的时间完成。 7.2可能影响项目进度的因素 有员工离职个人的工作方…...
k8s中设置annotation的方法总结
k8s中设置annotation的方法总结 annotation是什么 在 Kubernetes 中,Annotations 是一种用于向 Kubernetes 对象附加非标识性元数据的机制。 annotation有什么用 annotation与 Labels 类似,但有一些关键区别和特定用途。 常用于存储与对象相关的配置…...
第19天:信息收集-Web应用源码获取闭源备份开发泄漏WebPack打包资源搜索ICO定位
#知识点 1、信息收集-Web应用-源码获取-已知指纹&未知指纹 2、信息收集-Web应用-源码获取-泄漏问题&发现指纹 一、参考文章: https://www.secpulse.com/archives/124398.html https://mp.weixin.qq.com/s/QgLDdaefXlZtvlSiFQShZw 二、源码泄漏原因ÿ…...
uniapp小程序的锚点定位(将页面滚动到目标位置)
小程序中,a页面跳转到b页面,跳转后滚动定位到b页面的特定位置。 1.uni.pageScrollTo传递一个scrollTop参数可以滚动到特定位置。2.可以通过 uni.createSelectorQuery()等获取定位元素的位置信息。3.uni.getSystemInfoSync()获取设备的导航栏和状态栏高度…...
py脚本部署到服务器定时启动
py脚本部署到服务器定时启动 一、准备好你的脚本二、把脚本放到服务器三、在服务器创建脚本所需要的环境1、安装 Miniconda(如果不想安装 Anaconda 或 Miniconda,可以直接使用 Python 的venv模块创建虚拟环境,但安装 Conda 会更方便管理不同版…...
相机不动,机构动作----Hands Eyes
最近在研究 手眼标定,发现大家都需付费,搞啥子,说好的开源。。。 以相机在上固定不动,机械手为 EPSON_Robot 为例,详细的一步一步实例操作指引 EPSON_Robot 的192.168.0.1 2004 Server 详细操作步骤 1. 启动程序 运…...
Jdk1.7到Jdk1.8 HashMap 发生了什么变化(底层)
从JDK 1.7到JDK 1.8,HashMap在底层实现上发生了显著的变化, 主要体现在数据结构、链表插入方式、哈希算法、扩容机制以及并发性方面。 以下是具体的变化点: 1. 数据结构的变化 JDK 1.7:HashMap的底层数据结构是数组单向链表。…...
微积分复习笔记 Calculus Volume 2 - 4.2 Direction Fields and Numerical Methods
4.2 Direction Fields and Numerical Methods - Calculus Volume 2 | OpenStax...
java后端环境配置
因为现在升学了,以前本来想毕业干java的,很多java的环境配置早就忘掉了(比如mysql maven jdk idea),想写个博客记录下来,以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…...
Unity UI Button 事件优先级调整技术方案
Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中,针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法,旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…...
【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string
文章目录 知识回顾一、栈(Stack)和堆(Heap)1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢?值类型引用类型 2、总结 三、特殊的引用类…...
PHP排序算法:数组内有A~E,A移到C或者C移到B后排序,还按原顺序排序,循环
效果 PHP代码 public function demo($params){function moveNext($arr){$length count($arr);$lastElement $arr[$length - 1];for ($i $length - 1; $i > 0; $i--) {$arr[$i] $arr[$i - 1];}$arr[0] $lastElement;return $arr;}function moveAndReplace($array, $from…...
keepalived的高可用集群
keepalived的概念 keepalived的工作原理 基于vrrp实现的调度器高可用方案 keepalived的配置实验 先在调度服务器上安装keepalived和ipvsadm apt -y install keepalived ipvsadm 复制keepalived的配置文件到/etc/keepalived/目录下 cp /usr/share/doc/keepalived/samples/keep…...
基于单片机的农田灌溉系统(论文+源码)
1.系统设计 本系统主要实现如下目标: 1.可以实时监测土壤湿度; 2.土壤湿度太低时,进行浇水操作; 3.可以按键设置湿度的触发阈值; 4. 可以实现远程操控 5.可以实现手…...
技术文档分享——绘制精准航海图:技术文档规划、表达与维护的艺术
绘制精准航海图:技术文档规划、表达与维护的艺术 方向一:技术文档的规划布局从技术文档的规划布局入手,探讨如何确定文档的整体架构,如章节设置、逻辑顺序等,以确保信息呈现的系统性与连贯性。1. 确定文档的目标和读者…...
43124123
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
Pytorch应用实战(1)- 基于YOLO的视频人脸马赛克处理
免费链接: Blogger(需翻Q), Github 文章目录 本文介绍给图片的人脸打码给视频的人脸打码本文介绍 YoloV11(Github)提供了非常方便的API帮助用户实现目标检测(detect)、语义分割(segement)、肢体识别(Pose)等功能。 本文将基于YoloV11的目标检测来实现一个视频人脸马…...