前言
什么是Ray?
Ray 是一个开源统一框架,用于扩展 AI 和 Python 应用程序(如机器学习)。它提供了用于并行处理的计算层,因此您无需成为分布式系统专家。Ray 使用以下组件最大限度地降低了运行分布式单个和端到端机器学习工作流的复杂性:
- 可扩展的库,用于常见的机器学习任务,例如数据预处理、分布式训练、超参数调整、强化学习和模型服务。
- 用于并行化和扩展 Python 应用程序的 Pythonic 分布式计算原语。
- 用于将 Ray 集群与现有工具和基础设施(如 Kubernetes、AWS、GCP 和 Azure)集成并部署的集成和实用程序。
简单来说,ray能帮你把多台机器资源汇总,让你像使用一台机器一样使用。
Ray相关文档:
- 官网文档:https://docs.ray.io/en/latest/index.html
- Github:https://github.com/ray-project/ray
- Dockerhub:https://hub.docker.com/r/rayproject/ray
下载镜像
apptainer build --sandbox ray-2.42.0-py312-gpu docker://rayproject/ray:2.42.0-py312-gpu # CUDA:121
使用镜像
# docker run --shm-size=<shm-size> -t -i --gpus all rayproject/ray:<ray-version>-gpu
# 将docker命令转化为apptainer命令
apptainer shell --memory 400G --nv ray-2.42.0-py312-gpu
启动一个ray集群
找一个头节点:
export CUDA_VISIBLE_DEVICES=0,1
export NCCL_SOCKET_IFNAME=ibp101s0 # 指定网卡为ib卡
export GLOO_SOCKET_IFNAME=ibp101s0 # 指定网卡为ib卡
# 设置NCCL强制使用TCP:
export NCCL_P2P_DISABLE=1
export NCCL_IB_DISABLE=1
export NCCL_NET_GDR_LEVEL=0
ray start --head --node-ip-address 192.168.112.21 --port=6379 --dashboard-host='0.0.0.0' --dashboard-port=8265 # 如果需要ray以阻塞形式运行,可以使用 --block 参数。
在子节点运行:
export CUDA_VISIBLE_DEVICES=0,1
export NCCL_SOCKET_IFNAME=ibs20
# 设置NCCL强制使用TCP:
export NCCL_P2P_DISABLE=1
export NCCL_IB_DISABLE=1
export NCCL_NET_GDR_LEVEL=0
ray start --address='192.168.112.21:6379'
# 如果有多个正在运行的ray集群, You can override this by setting the `--address` flag or `RAY_ADDRESS` environment variable.
ray status --address='192.168.112.21:6379'
在其它容器中使用ray集群(不建议)
注意:如果启动ray集群和要使用的服务不是相同的镜像,那么要保证两个镜像内的运行环境一致!比如python版本,ray版本,版本号要完全一致!
这里我要运行一个vllm多机多卡服务,它的镜像本身已经集成了ray,所以在使用之前只需要设置与ray一样的环境即可(包括挂载目录以及一些环境变量)
export RAY_ADDRESS='192.168.112.21:6379' # 如果同时有多个ray集群,需要执行此环境变量来执行ray集群
遇到的错误
节点ip冲突
错误发生原因:在同一个机器起两个ray子节点,且连同一个ray头节点会有如下错误:
...... self._init_workers_ray(placement_group) File "/usr/local/lib/python3.12/dist-packages/vllm/executor/ray_distributed_executor.py", line 294, in _init_workers_ray raise RuntimeError( RuntimeError: Every node should have a unique IP address. Got 3 nodes with node ids ['3fa74530ac679c532b1b3a091b7a4fdc6797f17ab00cf02d1184c405', '62e58dbae784cb96da6adf5bc5d3d8ce316f948ee45ad84284f41915', '964988781f40a68c568efc2c19ddfb5b56dfd34dc047f8da8f4f77df'] and 2 unique IP addresses {'192.168.112.22', '192.168.112.21'}. Please check your network configuration. If you set `VLLM_HOST_IP` environment variable, make sure it is unique for each node.
版本不匹配
2025-02-24 11:32:19,417 INFO worker.py:1514 -- Using address 192.168.112.21:6379 set in the environment variable RAY_ADDRESS 2025-02-24 11:32:19,417 INFO worker.py:1654 -- Connecting to existing Ray cluster at address: 192.168.112.21:6379... 2025-02-24 11:32:19,502 INFO worker.py:1832 -- Connected to Ray cluster. View the dashboard at http://192.168.112.21:8265 ERROR 02-24 11:32:19 engine.py:389] Version mismatch: The cluster was started with: ERROR 02-24 11:32:19 engine.py:389] Ray: 2.42.0 ERROR 02-24 11:32:19 engine.py:389] Python: 3.12.8 ERROR 02-24 11:32:19 engine.py:389] This process on node 192.168.112.21 was started with: ERROR 02-24 11:32:19 engine.py:389] Ray: 2.42.0 ERROR 02-24 11:32:19 engine.py:389] Python: 3.12.9 Traceback (most recent call last): File "/usr/local/bin/vllm", line 8, in <module> sys.exit(main()) ...... File "/usr/local/lib/python3.12/dist-packages/vllm/entrypoints/openai/api_server.py", line 230, in build_async_engine_client_from_engine_args raise RuntimeError( RuntimeError: Engine process failed to start. See stack trace for the root cause.
原因,ray集群中的运行时与程序运行时的环境不一致。