Ray 是 UC berkley 提出的分布式机器学习。sklearn 是运行在单机上的机器学习,虽然支持多线程,但分布式并不支持。Ray 也支持 tensorflow,pytorch 和其他机器学习包. 这篇博客是先同样证明ray也是首先支持多线程的,分布式的支持我们在以后会给出范例。其实,分布式才是ray的优势。我们这里主要是学习为主,先看多线程。 主要看在一台机器上,多核是否都均匀负载。
1. 代码
我们先用SVM的代码来演示多线程,主要是为了看看Ray的运行机制和编程方法。前提是读者要先安装好ray的运行环境。怎样安装运行环境,先前已经有步骤说明。
# 1
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
import ray
# 2
ray.init()
# 3
digits = load_digits()
# 4
param_space = {
'C': np.logspace(-6, 6, 30),
'gamma': np.logspace(-8, 8, 30),
'tol': np.logspace(-4, -1, 30),
'class_weight': [None, 'balanced'],
}
model = SVC(kernel='rbf')
search = RandomizedSearchCV(model, param_space, cv=5, n_iter=300, verbose=10)
# 5
import joblib
from ray.util.joblib import register_ray
register_ray()
with joblib.parallel_backend('ray'):
search.fit(digits.data, digits.target)
第一部分是import python模块,第二部分 是 ray 初始化,第三部分是 load_digits, 是载入实验数据。第四部分 SVC 是指 SVM的 cross validation 模式,第五部分是 search.fit 是指分布式训练,这个范例是多线程训练。笔者自己也是在专研学习ray的 joblib模块,因为通过它,笔者努力调通集群模式下的SVM算法。这样就达到分布式的功能了。
2. 运行程序
运行上面的代码前,先可以新打开一个terminal,用htop命令,观察cpu核的负载情况。 当然服务器要租多核的,不能是一核的,笔者用的是8核,16G的CentOS version 8.3 的虚拟服务器。
3. 其他
本博客第一版是2021年4月30日。