惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
腾讯CDC
博客园 - Franky
Engineering at Meta
Engineering at Meta
C
Check Point Blog
T
The Blog of Author Tim Ferriss
有赞技术团队
有赞技术团队
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
I
InfoQ
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
S
SegmentFault 最新的问题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学

博客园 - xiezhengcai

日志分层设计 Ai阅读代码的局限性 业务系统缓存加速的五种缓存设计 The CustomResourceDefinition "applications.apps.abc.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes vscode ssh开发无法读取go env配置 deepspeed ray + nccl + 张量并行 训练 ray 分布式, 工作节点、reylet、 主节点、GCS ray分布式 nccl & mpi 跨节点通信 cudaMemsetParams 参数详细 cuda 中的内存拷贝 cuda 编程 cuda vllm 参数分类 张量计算流程图标注方法 为什么nn.Linear 的weight 是 (out_features, in_features) torch.view、unsqueeze、reshape、transpose 和 permute PyTorch交叉熵损失函数详解
ray集群
xiezhengcai · 2025-05-23 · via 博客园 - xiezhengcai

集群启动:

所有节点确保安装 pip install pydantic aiohttp_cors opencensus opencensus-ext-prometheus aiohttp grpcio protobuf
否则 dashboard 进程无法正常监听
通过pip list | grep -E "pydantic|aiohttp|opencensus|grpcio|protobuf|cors" 检查

ray start --head --port=6666 --num-cpus=2 --num-gpus=1 --dashboard-host=0.0.0.0 --dashboard-port=8888

--num-gpus:物理 GPU 显卡数量​
--num-cpus:可以使用的逻辑 CPU 核心数量​, 它不等于进程数, 因为进程被阻塞,cpu核心会空闲, ray 会启动新的进程

通过dashboard即可查看集群状态

加入集群:

ray start --address=10.230.40.150:6666 --num-gpus=1 --num-cpus=3

查看集群状态:

ray status

======== Autoscaler status: 2025-05-23 17:55:28.823514 ========
Node status
---------------------------------------------------------------
Active:
 1 node_e666f94db87e9eb640e41f8596c354a631289a02efbee3568ace9a06
 1 node_53af303def24ec9b741a2946276293680929b6d6d3d10b954f025025
Pending:
 (no pending nodes)
Recent failures:
 (no failures)

Resources
---------------------------------------------------------------
Total Usage:
 0.0/2.0 CPU
 0.0/2.0 GPU
 0B/48.30GiB memory
 0B/20.70GiB object_store_memory

Total Constraints:
 (no request_resources() constraints)
Total Demands:
 (no resource demands)

停止集群:

ray stop   // 如果在工作节点上执行, 则只停止工作节点, 如果在head节点执行,则停止整个集群

测试脚本

在ray集群中任何一个节点执行都可以

import os
os.environ["RAY_DEDUP_LOGS"] = "0"
import time
import ray

@ray.remote
class DataTracker:
    def __init__(self):
        self._counts = 0
    
    def increment(self):
        print(f"increment当前进程ID(PID): {os.getpid()}", flush=True)
        time.sleep(10 * 60)   
        self._counts += 1
    
    def counts(self):
        print(f"counts当前进程ID(PID): {os.getpid()}", flush=True)
        return self._counts

# 初始化Ray
ray.init(address="auto")

# 创建共享数据
database = ["Learning", "ray", "a", "b", "c", "d", "e", "f"]
db_object_ref = ray.put(database)  # 注意修正拼写错误: db_obeject_ref -> db_object_ref

# 创建tracker执行器
tracker = DataTracker.remote()

@ray.remote
def retrieve_tracker_task(item, tracker_ref, db_ref):
    print(f"Task {item} 当前进程ID(PID): {os.getpid()}", flush=True)
    time.sleep(10 * 60)  
    
    # 调用tracker的方法
    ray.get(tracker_ref.increment.remote())  # 等待increment完成
    
    # 获取数据库引用
    db = ray.get(db_ref)
    return item, db[item]

# 提交任务
retrieve_refs = [retrieve_tracker_task.remote(item, tracker, db_object_ref) for item in range(8)]


data = ray.get(retrieve_refs, timeout=20 * 60)  # 设置超时
print(data)
print(ray.get(tracker.counts.remote()))

# 清理
ray.shutdown()