- Ray 简介
- 部署过程
- 性能指标
- 性能测试
- 调参改进
- Docker 部署及测试
- 总结收获
- 参考资料
Ray 是一个分布式学习框架,主要用于满足高性能计算的需求。
具体地,针对 Pandas/Numpy 矩阵运算的分布式、异步调用支持进行优化,通过 remote function 自动向集群添加节点、调度任务。
首先安装 Ray 初级版本:
pip install -U ray
pip install ‘ray[default]’
查看版本 ray --version 的结果如下说明安装成功:
ray, version 1.13.0
(默认 python 环境已搭建完成)编写 test.py 测试文件:
通过 ray.init() 启动系统
把远程函数用 remote 标识(远程函数是无副作用的)
通过 ray.get() 获得函数返回结果
运行时,首先执行以下指令生成 head 节点:
ray start --head
这时会自动分配 head 节点 IP 端口,接下来,直接运行测试文件:
python3 test.py
计算任务仍是在本机运行的,只不过是以分布式的形式。
在执行过程中,Ray 提供了可视化硬件资源的 API,按照提示打开链接,可以在浏览器中看到资源占用情况:
上图显示了各节点对 RAM,CPU,Disk 等资源的利用率,能粗略估计系统压力。
性能指标由于 Ray 主要用于执行计算任务,我们提出的性能评估标准主要用于衡量运算效率。
- 系统响应时间:衡量 Ray 分布式节点的响应速度,由
T
r
e
m
o
t
e
f
u
n
c
t
i
o
n
s
t
a
r
t
−
T
t
e
s
t
p
r
o
g
r
a
m
s
t
a
r
t
T_{remote function start}-T_{test program start}
Tremote function start−Ttest program start 得到
- 优点:能准确体现出 Ray 分配任务、启动节点时间效率
- 缺点:仅包含了初始化过程,忽略了节点执行计算任务的时间开销
- 平均计算时间:各节点进行计算任务的用时的平均值
- 优点:净运行时间,综合体现了 Ray 分布式运算的调度性能
- 缺点:与硬件相关性较大,需要控制处理器核心数
- 延迟时间:Ray 完成整个计算任务所用的时间,由
T
t
e
s
t
p
r
o
g
r
a
m
e
n
d
−
T
t
e
s
t
p
r
o
g
r
a
m
s
t
a
r
t
T_{test program end}-T_{test program start}
Ttest program end−Ttest program start 得到
- 充分体现了 Ray 分配任务、执行运算的整体效率,与未进行分布式部署的本地朴素计算对比可以获得 Ray 的相对优化效率
- 计算时间标准差:提取各节点计算时间
T
1
∼
T
n
T_1 sim T_n
T1∼Tn,统计此数列标准差
- 优点:如果分布式系统调度合理,各节点运行时间应该是大致相等的,如果标准差过大,说明 Ray 鲁棒性不强,任务分配不平衡,运行效率容易出现波动
- 缺点:难以生成合适的测试数据来完成对任务分配的考核
- 效率提升系数:每增加一个核(或 gpu)任务执行效率提升的百分比
- 优点:能反映出 Ray 在不同硬件条件下的计算能力,可以用于优化硬件配置
- 缺点:在个人电脑(虚拟机)上很难控制核数、gpu数等硬件条件用于实验,系数不易测量
综合考虑本机性能是否支持、评价体系是否完善、测试数据是否朴实等问题,我们选择了系统响应时间和平均计算时间作为此次实验 Ray 性能测试的标准。
性能测试由于 Ray 未提供性能测试工具,且考虑到其主要用于完成分布式训练的计算任务,我们选择矩阵乘法(朴素矩阵乘法,时间复杂度 O ( N 3 ) O(N^3) O(N3),空间复杂度 O ( N 2 ) O(N^2) O(N2))作为测试程序。
进行单机部署测试,通过 python time 包获得关键时间,统计得出的数据如下:
| 测试指标 | 节点1 | 节点2 | 节点3 | 节点4 | 平均数值 |
|---|---|---|---|---|---|
| 平均计算时间 | 1.1104 | 2.1383 | 2.9929 | 3.7806 | 2.5056 |
| 系统响应时间 | 0.5741 | 1.0251 | 1.5160 | 2.0794 | 1.2986 |
可以发现:
- 发生时间递增,节点1 至 节点4 按照先后顺序分别分配任务
- 系统响应时间做差,可以得到 Ray 启动每个节点的时间大致为 0.502
- 平均计算时间做差,可以得到 Ray 节点执行每个任务大概耗时 0.891
尽管数据量的增大会增大计算时间的资源占比,启动节点、分配任务的消耗还是不可忽视的。
调参改进这一部分的任务是通过简单调参优化上述测试指标(优化效率不小于 20 % 20% 20%)。
浏览相关资料可知,@ray.remote 可以添加不同的参数,比如用 num_return_vals 确定函数返回值个数等。
我们选择改变 num_gpus 参数(设置为 2),控制函数节点可以使用的 gpu 数量,用于加速计算过程,效果如下:
| 测试指标 | 节点1 | 节点2 | 节点3 | 节点4 | 平均数值 |
|---|---|---|---|---|---|
| 平均计算时间 | 0.8816 | 1.5234 | 2.2328 | 2.6665 | 1.8261 |
| 系统响应时间 | 0.4597 | 0.8600 | 1.2900 | 1.7380 | 1.0869 |
与我们的预估效果相同:响应时间未有明显改进,计算时间有较大幅度的优化。
综合效率提升: 2.5056 − 1.8261 2.5056 = 27.12 % frac{2.5056-1.8261}{2.5056}=27.12% 2.50562.5056−1.8261=27.12%
Docker 部署及测试Docker 可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,实现虚拟化。
在这一任务中,我们通过 docker 获得一致的镜像(ubuntu),在不同容器构成的节点中安装 pip3,python3,Ray,配置运行环境。
由于相较于本机裸跑环境下更长、更不稳定的响应时间,在 docker 测试中我们主要关注于不同节点间任务分配的平衡性。
首先,下载 Ubuntu 镜像:
docker pull ubuntu
在测试文件夹下,打开两个终端,作为以后容器(节点)的操作界面。
在两个终端中分别执行如下指令,生成 docker 容器(也是即将使用的节点),命名为 ubuntu-01,ubuntu-02:
docker run -it --name ubuntu-01 ubuntu bash
docker run -it --name ubuntu-02 ubuntu bash
新打开一个终端,查看两个容器的 IP 地址:
docker inspect -f “{{ .NetworkSettings.IPAddress }}” ubuntu-01
docker inspect -f “{{ .NetworkSettings.IPAddress }}” ubuntu-02
可以看到,地址分别为 172.17.0.2,172.17.0.3。
在两个容器内分别配置环境:安装 python,ray 的依赖:
apt update && apt install python3
apt install python3-pip
pip3 install ray
之后和单机操作相同,不过注意启动 ray 时要绑定 IP 地址,比如将 ubuntu-01 作为 head 节点:
ray start --head --node-ip-address 172.17.0.2
另一个节点作为 worker 节点:
ray start --address=‘172.17.0.2:6379’ --redis-password=‘5241590000000000’
之后运行相同的程序,不过注意,ray.init() 参数需要改变,应该绑定到合适的端口,与上文中 head 节点相同:
ray.init(address=‘172.17.0.2:6379’, _redis_password=‘5241590000000000’)
在容器中新建测试文件是比较麻烦的:
- 用 echo 输入文本到文件中
- apt 安装 vim,之后再进行编辑
所以,我们选择将原有的本地文件拷贝到容器中。
先获得容器长 ID:
sudo docker inspect -f ‘{{.ID}}’ ubuntu-01
进行测试文件拷贝:
sudo docker cp /home/jiuguaiwf/lab4/test.py eec0fcfaf3e83929783e31c5eb1b51bf5e44fb40367914135fc627a24ea36aa9:/test.py
运行测试程序与之前相同:
python3 text.py
docker 部署测试结果如下(系统响应时间在测试时波动过大,略去):
| 测试指标 | 节点1 | 节点2 | 节点3 | 节点4 | 平均数值 |
|---|---|---|---|---|---|
| 平均计算时间 | 1.5979 | 2.4747 | 3.9734 | 4.7221 | 3.1920 |
可以看到,docker 容器内的运行效率是有明显降低的,速度降低了 3.1920 − 2.5056 2.5056 = 27.39 % frac{3.1920-2.5056}{2.5056}=27.39% 2.50563.1920−2.5056=27.39%。
总结收获通过完成 Lab4 ,我们收获良多:
- 动手实现了分布式系统的部署,为以后利用高性能框架打下基础
- 简单学习了 docker 等工具的使用,工程操作更加熟练
- 感受了限制系统性能的因素,对硬件资源、结构算法的协调有了进一步认识
- 通过手动调参优化了系统性能,加深了对课程内容的理解
- 查阅了大量资料,锻炼了学习能力
使用docker搭建Ray集群
Ray分布式计算框架详解
分布式执行框架——Ray简单使用
使用Ray集群简单创建Python分布式应用程序



