在dask_ml中运行GridSearchCV触发cupy相关TypeError如何解决
报错根因
你当前使用的X_train、y_train为cudf格式对象,dask-ml的GridSearchCV搭配scikit-learn原生SVC运行时,会尝试将GPU端的cudf数据隐式转换为CPU端的numpy数组,触发了cudf禁止隐式跨设备数据转换的规则,因此抛出该错误。
可行解决办法
- 方案1:轻量修改,适配原生sklearn模型
显式将GPU端数据转换为CPU端numpy数组即可,仅需修改参数传入逻辑:
该方案无需修改其他代码逻辑,适合小数据集场景;缺点是数据需要从GPU迁移到CPU,会损失GPU加速收益。svc = ParamSelection(X_train.astype(cp.int_).to_array(), y_train.astype(cp.int_).to_array(), 10) - 方案2:替换为GPU原生SVC实现,保留全链路GPU运算
采用RAPIDS cuml库的GPU版SVC替换sklearn原生CPU版SVC,cuml模型原生支持cudf/cupy格式的GPU端数据输入,无需跨设备转换:
首先导入cuml的SVC:
再将from cuml.svm import SVCParamSelection函数中的svc = svm.SVC()替换为svc = SVC()即可,全程运行在GPU侧,性能远高于CPU方案,适合大数据集寻优场景。 - 方案3:dask分布式GPU场景适配
如果你的数据集是dask-cudf分布式格式,可在调用fit时指定joblib的cuda后端,避免隐式数据转换:from joblib import parallel_backend def ParamSelection(X, Y, nfolds): param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],'kernel':['linear'], 'gamma':[0.001, 0.01, 0.1, 1, 10, 100]} svc = SVC() grid_search = dcv.GridSearchCV(svc, param_grid, cv = nfolds) # 新增cuda后端上下文 with parallel_backend('cuda'): grid_search.fit(X, Y) print(grid_search.best_params_) print(grid_search.best_estimator_) print(grid_search.best_score_) return grid_search.best_estimator_
内容的提问来源于stack exchange,提问作者Roman Micuda
相关产品推荐
相关产品推荐

