Ray Tune的使用
官方文档:链接。有时版本不用用法不同,解决不了的问题请参考官方文档。
1、下载(只下载了ray的tune部分)
pip install -U "ray[tune]"
2、import
from ray import tune
#这里需要引入对应的搜索策略
from ray.tune.search.hyperopt import HyperOptSearch
3、在自己代码中修改
dataloader部分、模型部分、训练和测试函数不需要修改。
需要修改的地方:
①在train的过程中,每一个epoch得到的损失或者准确率后添加:tune.report(),其中的指标可以选择mean_loss或者mean_accuracy
def Trainer(model, classifier, train_dl, valid_dl, test_dl, device,
configs):
# Start training
print("Training started ....")
training_mode = configs.mode
experiment_log_dir = configs.experiment_log_dir
model_optimizer = torch.optim.Adam(model.parameters(),lr=config["lr"],weight_decay=config["decay_rate"])
classifier_optimizer = torch.optim.Adam(classifier.parameters(), lr=config["lr"],weight_decay=config["decay_rate"])
criterion = nn.CrossEntropyLoss()
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(model_optimizer, 'min')
print('Pretraining on source dataset')
for epoch in range(1, configs.num_epoch + 1):
# Train and validate
"""Train. In fine-tuning, this part is also trained???"""
train_loss = model_pretrain(model, model_optimizer, criterion, train_dl, configs, device, training_mode)
# print(f'\nPre-training Epoch : {epoch}', f'Train Loss : {train_loss:.4f}')
print(f'Pre-training Epoch : {epoch} Train Loss : {train_loss.item():.4f}')
#每个epoch结束时,添加tune.report()
tune.report(mean_loss=train_loss)
os.makedirs(os.path.join(experiment_log_dir, "saved_models"), exist_ok=True)
chkpoint = {'model_state_dict': model.state_dict()}
torch.save(chkpoint, os.path.join(experiment_log_dir, "saved_models", f'ckp_last.pt'))
print('Pretrained model is stored at folder:{}'.format(experiment_log_dir+'/saved_models/'+'ckp_last.pt'))
②定义搜索空间,各项指标都可以通过tune的
config= {"lr": tune.grid_search([0.001, 0.01, 0.1]),
"momentum": tune.uniform(0.1, 0.9),
"hidden_layer_sizes": tune.choice([(32, 32), (64, 64), (128, 128)])}
③在对应的地方传入定义好的搜索空间
model_optimizer = torch.optim.Adam(model.parameters(),lr=config["lr"],weight_decay=config["decay_rate"])
classifier_optimizer = torch.optim.Adam(classifier.parameters(), lr=config["lr"],weight_decay=config["decay_rate"])
④调用tune.run(),开始训练
analysis = tune.run(
#这里传入训练过程函数Trainer,Trainer的参数写入data =()中,
#如果Trainer的参数只有config,那么可以去掉data=(),只写Trainer
tune.with_parameters(
Trainer,data=(pretrain_model, classifier, train_dl, finetune_dl, test_dl, device, configs)
),
num_samples=20, #每个参数的实验次数
# 定义搜索策略
scheduler=HyperOptSearch(metric="mean_accuracy", mode="max"),
config=config,
)
搜索策略 |
---|
随机搜索 (Random search): 在每一轮试验中,随机抽取一个超参数组合进行评估。随机搜索不需要假设超参空间中的分布形状,因此在处理复杂任务和超参空间不规则的情况下表现良好。 |
网格搜索 (Grid search): 将超参数空间划分为网格,每个网格点表示一个超参数组合,然后遍历每个网格点进行评估。与随机搜索相比,网格搜索比较耗时且效果不如随机搜索,但是对于每个维度都有着对超参数范围均匀采样的需求的场合,网格搜索是很有用的。 |
超带宽极端学习机 (Hyperband): 采用自适应资源分配和提前停止的策略,比如弱模型使用少量资源,强模型使用更多资源,并且优先考虑弱模型的分配资源。超带宽极端学习机是一种高效的搜索策略,而且可以立即停止那些不发挥作用的试验。 |
折半搜索 (ASHA): 对试验按照性能进行排序,然后每一轮去掉效果最低的一部分试验。ASHA 算法是一种加速学习过程的策略,对超参数估计的误差也比较少。 |
贝叶斯优化: 使用贝叶斯优化算法在当前已经经过的试验结果上构建目标函数的后验分布,并利用探索和开发的权衡,选择下一个待评估的超参数点。贝叶斯优化算法在每次迭代时都能够确定最可能优于当前最佳结果的一组参数,并在调整后的目标函数上评估。 |
PBT 如何调整 (Population-Based Training): 通过对已经进行过的试验进行评估,优化器从中选择出最优秀的试验,通过复制、变异和杀死策略来生成新的试验。 |
4、常见错误
①策略需要单独下载
解决方法:按照提示,直接pip下载
②
解决办法:将tune.run()中的scheduler换为