前言
这个文件夹下放置了python最核心的代码,从文件夹命名就可以知道,这部分的代码并不是用户可修改的部分,而是ray进行任务管理、节点交互、GCS通信等核心功能实现。
核心实现
概览
文件名/模块名 | 功能描述 |
---|---|
services.py | 负责 Ray 的核心服务管理,包括启动和停止 Ray 的各个服务(如 GCS、Raylet 等)。 |
worker.py | 实现 Ray 的 Worker 进程逻辑,负责执行 Task 和管理 Task 的生命周期。 |
gcs_xxx.py | 提供与 GCS 交互的核心类与函数,负责与GCS进行信息互动。 |
state.py | 实现 Ray 的状态管理,包括 Task、Actor、Object 等的状态查询和监控。 |
ray_constants.py | 定义 Ray 的常量和配置项,如默认端口号、超时时间等。 |
log_monitor.py | 监控和管理 Ray 的日志文件,支持日志的轮转和清理。 |
memory_monitor.py | 监控 Worker 进程的内存使用情况,防止内存泄漏或 OOM(Out of Memory)。 |
metrics_agent.py | 收集和上报 Ray 的运行时指标,用于监控和性能分析。 |
serialization.py | 实现对象的序列化和反序列化,支持跨进程和跨语言的数据传输。 |
signature.py | 解析和验证 Python 函数的签名,确保 Task 的参数传递正确。 |
parameter.py | 管理 Ray 的配置参数,支持从文件或环境变量中加载配置。 |
runtime_env/ | 管理 Task 和 Actor 的运行时环境,包括依赖安装和环境隔离。 |
storage.py | 管理不同的存储后端,并且对存储产物进行管理 |
services.py
特性 | 描述 |
---|---|
多工具支持 | 支持 Valgrind、GDB、Jemalloc 等多种调试和性能分析工具,确保开发人员可以方便地进行性能分析和调试。 |
环境变量控制 | 通过环境变量动态控制调试工具的启用,提高了灵活性,允许在不修改代码的情况下启用或禁用调试工具。 |
日志管理 | 支持日志文件的读取、轮转和备份,确保日志文件不会过大,并且开发人员可以快速定位问题。 |
命令行参数解析 | 通过复杂的命令行参数解析,确保能够正确获取配置信息,如 Redis 地址、节点 IP 等。 |
进程管理 | 支持通过 tmux 启动进程,确保进程可以在后台运行,适合长时间任务。 |
错误处理 | 在 Dashboard 启动失败时,自动读取日志文件并返回错误信息,帮助开发人员快速定位问题。 |
日志轮转 | 支持日志文件的轮转和备份,确保日志文件不会过大,并且可以保留历史日志。 |
worker.py
特性 | 描述 |
---|---|
泛型支持 | RemoteFunction 系列类通过泛型类型注解支持不同参数数量的远程函数,确保类型安全。 |
任务依赖 | 支持 ObjectRef 和 DAGNode 作为参数,允许链式调用和任务依赖,构建复杂的任务图。 |
错误处理 | 通过 _unhandled_error_handler 和 raise_errors 方法处理未捕获的异常,确保错误信息能够被记录。 |
环境变量控制 | 支持通过环境变量 RAY_IGNORE_UNHANDLED_ERRORS 动态控制错误处理行为,提高灵活性。 |
线程安全 | 通过锁机制确保反序列化操作的线程安全,防止并发访问导致的竞态条件。 |
序列化上下文 | 支持自定义序列化上下文,确保反序列化操作的灵活性。 |
任务配置 | 通过 HasOptions 协议实现统一的 options 方法,用于配置任务选项。 |
由于这个代码里面包含了主要的api 接口,下面稍微展开讲一下各个api接口的实现。
init
-
核心代码实现:https://github.com/ray-project/ray/blob/master/python/ray/_private/worker.py#L1275
-
核心实现函数:
-
核心功能:创建或连接上已存在的Ray cluster
-
代码里会把所有的参数转换为RayParam,这里总结ray cluster 使用到的所有参数:
参数名 | 类型/默认值 | 描述 |
---|---|---|
redis_address | str | Redis 服务器的地址。如果未提供,Ray 会启动 Redis、raylet、Plasma 存储等组件。 |
redis_port | int / DEFAULT_PORT | 主 Redis 分片的监听端口。如果未指定,则使用默认端口或随机端口。 |
redis_shard_ports | List[int] | 非主 Redis 分片的端口列表。如果未指定,则使用 redis_port 之后的端口或随机端口。 |
num_cpus | int | 配置 raylet 的 CPU 数量。 |
num_gpus | int | 配置 raylet 的 GPU 数量。 |
resources | Dict[str, float] | 可用资源的字典,键为资源名称,值为资源数量。 |
labels |