实验性 Java API#

警告

Java API 支持是一项实验性功能,可能会发生更改。

目前 KubeRay 不支持 Java API。

Java 是一种主流的生产服务编程语言。Ray Serve 提供了一个原生的 Java API,用于创建、更新和管理部署。您可以使用 Java 创建 Ray Serve 部署,并通过 Python 调用它们,反之亦然。

本节将帮助您

  • 创建、查询和更新 Java 部署

  • 配置 Java 部署资源

  • 使用 Java API 管理 Python 部署

创建部署#

通过将类的全名作为 `Serve.deployment()` 方法的参数(如下面的代码所示),您可以创建并部署该类的部署。

  public static class Counter {

    private AtomicInteger value;

    public Counter(String value) {
      this.value = new AtomicInteger(Integer.valueOf(value));
    }

    public String call(String delta) {
      return String.valueOf(value.addAndGet(Integer.valueOf(delta)));
    }
  }

  public void create() {
    Application app =
        Serve.deployment()
            .setName("counter")
            .setDeploymentDef(Counter.class.getName())
            .setNumReplicas(1)
            .bind("1");
    Serve.run(app);
  }

访问部署#

部署后,您可以通过名称获取其实例。

  public Deployment query() {
    Deployment deployment = Serve.getDeployment("counter");
    return deployment;
  }

更新部署#

您可以更新部署的代码和配置,然后重新部署它。下面的示例将“counter”部署的初始值更新为 2。

  public void update() {
    Application app =
        Serve.deployment()
            .setName("counter")
            .setDeploymentDef(Counter.class.getName())
            .setNumReplicas(1)
            .bind("2");
    Serve.run(app);
  }

配置部署#

Ray Serve 允许您配置部署以

接下来的两节将介绍如何配置您的部署。

扩展#

通过指定 `numReplicas` 参数,您可以更改部署副本的数量

  public void scaleOut() {
    Deployment deployment = Serve.getDeployment("counter");

    // Scale up to 2 replicas.
    Serve.run(deployment.options().setNumReplicas(2).bind());

    // Scale down to 1 replica.
    Serve.run(deployment.options().setNumReplicas(1).bind());
  }

资源管理 (CPU、GPU)#

通过 `rayActorOptions` 参数,您可以为每个部署副本预留资源,例如一个 GPU

  public void manageResource() {
    Map<String, Object> rayActorOptions = new HashMap<>();
    rayActorOptions.put("num_gpus", 1);
    Application app =
        Serve.deployment()
            .setName("counter")
            .setDeploymentDef(Counter.class.getName())
            .setRayActorOptions(rayActorOptions)
            .bind();
    Serve.run(app);
  }

管理 Python 部署#

Python 部署也可以通过 Java API 进行管理和调用。假设您的 Python 文件 `counter.py` 位于 `/path/to/code/` 目录中

from ray import serve

@serve.deployment
class Counter(object):
    def __init__(self, value):
        self.value = int(value)

    def increase(self, delta):
        self.value += int(delta)
        return str(self.value)

您可以通过 Java API 部署它,并通过 `RayServeHandle` 调用它

import io.ray.api.Ray;
import io.ray.serve.api.Serve;
import io.ray.serve.deployment.Deployment;
import io.ray.serve.generated.DeploymentLanguage;
import java.io.File;

public class ManagePythonDeployment {

  public static void main(String[] args) {

    System.setProperty(
        "ray.job.code-search-path",
        System.getProperty("java.class.path") + File.pathSeparator + "/path/to/code/");

    Serve.start(true, false, null);

    Deployment deployment =
        Serve.deployment()
            .setDeploymentLanguage(DeploymentLanguage.PYTHON)
            .setName("counter")
            .setDeploymentDef("counter.Counter")
            .setNumReplicas(1)
            .setInitArgs(new Object[] {"1"})
            .create();
    deployment.deploy(true);

    System.out.println(Ray.get(deployment.getHandle().method("increase").remote("2")));
  }
}

注意

在 `Ray.init` 或 `Serve.start` 之前,您需要指定一个目录来查找 Python 代码。有关详细信息,请参阅 跨语言编程

未来路线图#

未来,Ray Serve 计划提供更多 Java 功能,例如

  • 改进的 Java API,以匹配 Python 版本

  • HTTP 入口支持

  • 将您自己的 Java Spring 项目作为部署