Lindorm Ray节点

更新时间:
复制为 MD 格式

DataWorksLindorm Ray节点支持使用Ray分布式计算框架进行Python任务的开发和周期性调度。本文为您介绍使用Lindorm Ray节点进行任务开发的主要流程。

节点介绍

Lindorm计算引擎提供基于Ray分布式计算框架的计算服务,兼容开源Ray接口,支持Python编程模型,适用于分布式计算、机器学习、数据处理等场景。通过DataWorksLindorm Ray节点,在线编写Python代码并配置Ray提交命令,实现Ray作业的开发、调试和周期性调度。

使用限制

  • 资源组限制:Lindorm Ray节点仅支持通过Serverless资源组运行。

  • 语言限制:Lindorm Ray节点仅支持Python语言。

  • 运行限制:不支持单行或代码块运行,仅支持整体提交运行。

准备工作

  • 已创建Lindorm实例并绑定至DataWorks工作空间,详情请参见绑定Lindorm计算资源

  • 已在Lindorm控制台创建Ray资源组,详情请参见使用RAY资源组

  • (可选,RAM账号需要)进行任务开发的RAM账号已被添加至对应工作空间中,并具有开发空间管理员(权限较大,谨慎添加)角色权限,添加成员的操作详情请参见为工作空间添加空间成员

    说明

    如果您使用的是主账号,则忽略该添加操作。

新建Lindorm Ray节点

新建入口参考:创建Lindorm Ray节点

开发Lindorm Ray节点

Lindorm Ray节点的开发包含两部分:在代码编辑区编写Python代码,并在Ray提交命令区配置作业提交命令。

示例一:编写Python代码直接运行

以使用蒙特卡洛方法估算圆周率为例,为您介绍如何配置和使用Lindorm Ray节点。

步骤一:编写Python代码

Lindorm Ray节点的代码编辑区中,编写以下Python代码。该示例使用Ray@ray.remote装饰器将计算任务分发到多个Worker并行执行,通过随机采样估算圆周率。

import ray
import random
import time
import sys

ray.init()

@ray.remote
def compute_points_in_circle(num_points: int) -> int:
    """
    远程函数:在单位正方形内随机生成点,统计落在单位圆内的数量
    """
    inside = 0
    for _ in range(num_points):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        if x * x + y * y <= 1:
            inside += 1
    return inside

def estimate_pi(total_points: int, num_workers: int = 4) -> float:
    """
    使用 Ray 并行估算 π
    """
    start_time = time.time()
    points_per_worker = total_points // num_workers

    print(f"开始估算 π,总点数: {total_points:,},工作节点: {num_workers}")

    # 提交多个远程任务
    tasks = [compute_points_in_circle.remote(points_per_worker) for _ in range(num_workers)]

    # 收集结果
    results = ray.get(tasks)
    total_inside = sum(results)

    # 计算 π
    pi_estimate = 4.0 * total_inside / total_points

    duration = time.time() - start_time

    print("=" * 60)
    print("Ray Sample: Calculating π using Monte Carlo Method")
    print("=" * 60)
    print(f"Total samples: {total_points:,}")
    print(f"Points inside circle: {total_inside:,}")
    print(f"Estimated π: {pi_estimate:.10f}")
    print(f"Time taken: {duration:.4f} seconds")
    print(f"Workers used: {num_workers}")
    print("=" * 60)
    print("Calculation complete!")

    return pi_estimate

if __name__ == "__main__":
    estimated_pi = estimate_pi(total_points=int(sys.argv[1]), num_workers=4)
    ray.shutdown()

步骤二:配置Ray提交命令

在节点的Ray提交命令区域中,配置以下提交命令。

ray job submit \ 
--working-dir "." \
-- python calculate_pi.py 1000000
重要
  • --working-dir参数值为本地路径时,-- python参数所指定的文件名需要与节点同名或与python代码引用的资源文件同名。

  • --working-dir 为本地路径,作业提交时--address--submission-id--working-dir参数的值由平台自动控制。如果您在提交命令中手动配置了上述参数,其值将被平台覆盖。若--working-dir用户填写的值是https://开头的远程路径,那么不会覆盖(例如直接使用oss路径)。

节点内容配置说明

您可参照以下参数配置信息,配置Lindorm Ray节点内容。

配置区域

参数名称

参数描述

代码编辑区

Python代码

编写使用Ray框架的Python代码。支持ray.init()初始化、@ray.remote装饰器等Ray API。

Ray提交命令

提交命令

配置Ray作业的提交命令。命令格式为ray job submit [options] -- python script.py [args]

runtime-env-json

可选。配置运行时环境。例如通过pip字段安装额外的Python依赖包,示例:--runtime-env-json '{"pip": ["numpy", "pandas"]}'

参数

填写您所需传入代码的参数信息。您可将该参数配置为动态参数${var}

示例二:引用DataWorks资源文件运行

当您的Ray作业包含多个Python模块文件时,可以将公共模块上传为DataWorks资源文件,并在主程序中通过##@resource_reference语法引用。

步骤一:创建并上传资源文件

DataWorks中创建以下两个Python资源文件。

资源文件一:circle_utils.py

"""
计算圆内点的工具模块
"""
import random

def compute_points_in_circle(num_points: int) -> int:
    """
    在单位正方形内随机生成点,统计落在单位圆内的数量
    """
    inside = 0
    for _ in range(num_points):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        if x * x + y * y <= 1:
            inside += 1
    return inside

资源文件二:pi_estimator.py

"""
π 估算工具模块
"""
import time

def estimate_pi(results, total_points: int) -> float:
    """
    根据圆内点数估算 π
    """
    start_time = time.time()
    total_inside = sum(results)
    pi_estimate = 4.0 * total_inside / total_points
    duration = time.time() - start_time

    print(f"总点数: {total_points:,}")
    print(f"圆内点数: {total_inside:,}")
    print(f"估算 π ≈ {pi_estimate:.6f}")
    print(f"耗时: {duration:.2f} 秒")

    return pi_estimate

步骤二:编写主程序代码

Lindorm Ray节点的代码编辑区中,通过##@resource_reference引用已上传的资源文件,并编写主程序代码。

##@resource_reference{"circle_utils.py"}
##@resource_reference{"pi_estimator.py"}
"""
使用 Ray 并行计算 π 主程序
"""
import sys
import ray
from circle_utils import compute_points_in_circle
from pi_estimator import estimate_pi

@ray.remote
def compute_points_in_circle_remote(num_points: int) -> int:
    """
    远程函数:包装计算函数
    """
    return compute_points_in_circle(num_points)

if __name__ == "__main__":
    ray.init()

    total_points = int(sys.argv[1])
    num_workers = 4
    points_per_worker = total_points // num_workers

    print(f"开始估算 π,总点数: {total_points:,},工作节点: {num_workers}")

    # 提交多个远程任务
    tasks = [compute_points_in_circle_remote.remote(points_per_worker) for _ in range(num_workers)]

    # 获取结果
    results = ray.get(tasks)

    # 计算 π
    estimated_pi = estimate_pi(results, total_points)

    # 关闭 Ray
    ray.shutdown()

步骤三:配置Ray提交命令

在节点的Ray提交命令区域中,配置以下提交命令。

ray job submit \
--working-dir "." \
-- python main.py 1000000
说明

引用DataWorks资源文件时,平台会自动将资源文件下载到工作目录中,通过--working-dir "."参数指定当前工作目录即可在代码中正常导入引用的模块。

调试Lindorm Ray节点

  1. 配置调试属性。

    您可在节点右侧运行配置中配置计算资源Lindorm资源组资源组信息,具体参数信息如下。

    参数名称

    描述

    计算资源

    选择您所绑定的Lindorm计算资源。

    Lindorm资源组

    选择您在Lindorm控制台创建的Ray资源组。

    资源组

    选择已通过网络连通性测试的Serverless资源组。Lindorm Ray节点仅支持Serverless资源组。

    脚本参数

    在配置节点内容时,通过${参数名}的方式定义变量,需要在脚本参数处配置参数名参数值信息,任务运行时会将它动态替换为真实的取值。详情请参见调度参数来源及其表达式

  2. 调试运行节点。

    执行节点任务,您需单击保存运行节点任务。

后续步骤

  • 节点调度配置:若项目目录下的节点需要周期性调度执行,您需要在节点右侧的调度配置中设置调度策略,配置相关的调度属性。

  • 节点发布:若任务需要发布至生产环境执行,请单击界面image图标唤起发布流程,通过该流程将任务发布至生产环境。项目目录下的节点只有在发布至生产环境后,才会进行周期性调度。