GPU模型重载初始化
1.默认初始化
默认GPU加载在GPU(0)上进行相关初始化。
解决方案:os.environ['CUDA_VISIBLE_DEVICES']='gpu_idx,...'
2.GPU重加载问题
最近在弄交叉验证,代码自动跑,现在发现的问题是,每一折结束后,新一折加载新的模型到GPU会报错,但是程序还能继续跑,报错如下:
CPU测试了没有任何问题。觉得是重新加载模型到GPU的时候,GPU显存未释放还是啥?
找到问题所在:同一种模型重新加载到模型上进行初始化的时候出现的,我改成同一个模型重新初始化或者load_parameters就不会出现…
所以就想问问,如果我加载不同模型到GPU,也就是不同种的模型或者同种模型的不同实例,重新加载到GPU就会报这种问题…咋解决,如何自己判断是否已经释放显存,然后根据这个释放条件再重新加载模型到GPU…
查了下API,有这个mxnet.context:gpu_memory_info ( device_id=0 ),我应该在上一个模型跑完后,进行下一个模型加载前,检查显存,然后free的话再加载…
Gluon Fit API旧版新版差异
第一个问题:下图是官网对应API
而下图是官网在tutorial中关于Gluon Fit API的例子
可以看到API中对于训练集和验证集的metric有别,而例子中只有一个metrics参数,实验也发现只有一个metrics参数,并且metrics参数对训练集和验证集都有效,由此引发第二个问题。
第二个问题:既然metrics同时作用于训练集和验证集,那么EarlyStoppingHandler中的monitor参数监听的metric是对训练集而言还是对验证集而言?还是可以设置分别监听训练集或验证集,而ValidationHandler则提供的API如图:
也没有提供对数据集的metric而是function,所以有点疑问…
看了下官网API以及自己本地MXNet的API,官网提供的API应该是最新版本,还没发布的吧,本地1.5.0版本的确没有train_metrics,val_metrics只有一个metrics…下次还是看本地的API好了…😂 目前还不能安装1.5.1版本的
看了estimator以及event_handler的官网API以及本地API,修改了一点东西,最新的API还是很方便,否则旧版API对于监听验证集上的metrics根本不行,因为传进去的只是train_metrics,estimator内部是深度复制了train_metrics作为val_metrics,而且在etimator.fit之前还不能获取到self.val_metrics,这个就很麻烦了。目前是自己根据理解改了下接口,还是希望新版早点发布吧,新版对其进行了进一步封装、精简以及对训练集和验证集分别加载handler、metrics,更清楚,最重要的是可以利用EarlyStopping进行监听验证集上的metrics。😀
修改版Estimator
1 | # Licensed to the Apache Software Foundation (ASF) under one |
Ndarray问题
Ndarray是MXNet对numpy的部分封装,更适用于深度学习和GPU加载。
Ndarray暂不支持字符串数组转型
1 | s = ['aa', 'bb', 'cc'] |
报错原因是Ndarray不支持字符串转型,解决方案:
1 | from sklearn.preprocessing import LabelEncoder |
Ndarray暂不支持多GPU加载
Ndarray暂不支持多GPU加载,没有模型的net.initialize(init=init.Xaiver(), ctx=[mx.gpu(), mx.gpu(1),...])那么方便
例如,我使用SigmoidBinaryCrossEntropyLoss的时候,对于其第四个参数pos_weight,在使用多GPU训练的时候会出现
1 | mxnet/mshadow/mshadow/./stream_gpu-inl.h:62: Check failed: e == cudaSuccess CUDA: an illegal memory access was encountered |
第一个问题是pos_weight多GPU加载位置不当,第二个是GPU并行计算的时候,我的pos_weight只加载在某一个gpu上,另一个gpu并没有加载导致(我这么认为)
目前的解决方案是,权重各自加载到对应gpu上,对应gpu上并行计算时,用各自的权重
1 | ctx = [mx.gpu(), mx.gpu(1)) |
这样就解决了上述错误,但个人认为这或许不太方便。
