实验性 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 项目作为部署