
目前是采用Ray分布式架构以将组内机器整合为可以互相借用资源的集群。如果需要做稍大规模的计算而我们无法在单个显卡上完成的话可以接入集群使用集群内的资源。Ray版本为2.58.0python3.12.14ubuntu版本为24.04建议创建一个独立的环境import ray包推荐使用miniconda或者python -m venv创建独立的环境windows电脑需要安装wsl2之后的操作就在wsl2中进行然后操作步骤和在ubuntu中是一样的。加入节点# 以miniconda为例创建名为ray-cluster的环境python3.12.14ray2.58.0 conda create -n ray-cluster python3.12 -y conda activate ray-cluster pip install ray[default]2.58.0 # 必装的两个包踩坑总结缺一个都会出诡异问题 pip install virtualenv # GPU 实验必装 CUDA 运行库ctranslate2 系框架不会自动装 pip install nvidia-cublas-cu12 nvidia-cudnn-cu12 # 接入ray头节点 ray start --address172.20.111.219:6379 --disable-usage-stats # 安装好了之后验证是否能接入集群成功显示集群中的node数 ray status为了防止节点因网络或者开关机中断需要在系统后台加入自动连接的服务创建ray-worker.service编辑内容如下[Unit] DescriptionRay Worker Node Afternetwork-online.target Wantsnetwork-online.target StartLimitIntervalSec0 [Service] Typesimple Userworker上的用户名 EnvironmentHOME/home/你的用户名 EnvironmentPATH/home/你的用户名/miniconda3/envs/ray-cluster/bin:/home/你的用户名/miniconda3/condabin:/usr/local/bin:/usr/bin:/bin ExecStartPre/home/你的用户名/miniconda3/envs/ray-cluster/bin/ray stop ExecStart/home/你的用户名/miniconda3/envs/ray-cluster/bin/ray start --address172.20.111.219:6379 --block --disable-usage-stats ExecStop/home/你的用户名/miniconda3/envs/ray-cluster/bin/ray stop Restartalways RestartSec5 TimeoutStopSec30 [Install] WantedBymulti-user.target保存后将该service加入系统即可自动连接节点了sudo cp ray-worker.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now ray-worker使用ray以下代码在任意节点的引导环境跑~/miniconda3/envs/ray-cluster/bin/python 脚本.py基础任务分发 看落点import ray, socket ray.init(addressauto) # 连接本机所在集群 ray.remote def where_am_i(): return ray.get_runtime_context().get_node_id() # 节点ID(唯一, 勿用hostname) print(ray.get([where_am_i.remote() for _ in range(64)]))调度要点默认策略优先在提交节点本地执行本地资源满才溢出到其他节点。毫秒级短任务不会分布秒级以上负载会自动分流ray.remote(scheduling_strategySPREAD)强制跨节点均摊轻任务也想分布时用num_gpus1/num_cpus4声明资源调度器自动路由到有空闲资源的机器指定节点执行NodeAffinityfrom ray.util.scheduling_strategies import NodeAffinitySchedulingStrategy reg {n[NodeManagerAddress]: n[NodeID] for n in ray.nodes() if n[Alive]} pin NodeAffinitySchedulingStrategy(node_idreg[172.20.111.53], softFalse) result my_task.options(scheduling_strategypin).remote(args)GPU 常驻 Actor大模型推理参考import ctypes ray.remote(num_gpus1) class ASRActor: def __init__(self): # 预加载 CUDA 库ctranslate2 系必需pip 装的库它找不到 site /home/用户名/miniconda3/envs/ray-cluster/lib/python3.12/site-packages/nvidia for rel in [cublas/lib/libcublas.so.12, cudnn/lib/libcudnn.so.9]: try: ctypes.CDLL(f{site}/{rel}, modectypes.RTLD_GLOBAL) except OSError: pass from faster_whisper import WhisperModel self.model WhisperModel(large-v3-turbo, devicecuda, compute_typefloat16) def transcribe(self, audio_bytes): import tempfile, os with tempfile.NamedTemporaryFile(suffix.flac, deleteFalse) as f: f.write(audio_bytes); p f.name segs, _ self.model.transcribe(p, languageen) os.unlink(p) return .join(s.text for s in segs).strip() # 每块 GPU 一个 ActorSPREAD 保证分布在两台机器 actors [ASRActor.options(scheduling_strategySPREAD).remote() for _ in range(2)] # 大文件先进对象存储再传引用避免重复传输 audio_ref ray.put(open(test.flac, rb).read()) # 轮流分发生产代码用 ray.util.ActorPool 更规范 futs [actors[i % 2].transcribe.remote(audio_ref) for i in range(20)] results ray.get(futs)这里以transcribe翻译函数为例可将transcribe函数改为模型推理函数。runtime env按任务隔离依赖# 提交时声明依赖节点自动建虚拟环境并缓存首次约 1 分钟之后秒级 rt {pip: [pandas2.2, scikit-learn1.5]} ray.remote(runtime_envrt) def task(x): import pandas # 隔离环境里可用 ...限制Python 版本跟随引导环境3.12不能按任务换解释器版本。实测 worker 节点的 pip 型 runtime env 存在兼容问题生产建议直接把依赖预装进两节点引导环