Ray:用於擴充套件和分發Python和ML應用的框架

banq發表於2022-02-20

Ray 為構建分散式應用程式提供了一個簡單、通用的 API。
透過以下方式完成了這一使命:
  1. 為構建和執行分散式應用程式提供簡單的原語。
  2. 使終端使用者能夠並行化單個機器程式碼,而程式碼更改幾乎為零。
  3. 在核心 Ray 之上包括一個由應用程式、庫和工具組成的大型生態系統,以支援複雜的應用程式。

在Ray Core之上是幾個用於解決機器學習問題的庫:

以及用於將 ML 和分散式應用程式投入生產的庫:

還有許多與 Ray 的社群整合,包括DaskMARSModinHorovodHugging FaceScikit-learn等。
Ray 提供 Python、Java 和EXPERIMENTAL C++ API。Ray 使用任務(函式)和Actors(類)來允許您並行化您的程式碼。
Java程式碼:

import io.ray.api.ActorHandle;
import io.ray.api.ObjectRef;
import io.ray.api.Ray;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class RayDemo {

  public static int square(int x) {
    return x * x;
  }

  public static class Counter {

    private int value = 0;

    public void increment() {
      this.value += 1;
    }

    public int read() {
      return this.value;
    }
  }

  public static void main(String[] args) {
    // Intialize Ray runtime.
    Ray.init();
    {
      List<ObjectRef<Integer>> objectRefList = new ArrayList<>();
      // Invoke the `square` method 4 times remotely as Ray tasks.
      // The tasks will run in parallel in the background.
      for (int i = 0; i < 4; i++) {
        objectRefList.add(Ray.task(RayDemo::square, i).remote());
      }
      // Get the actual results of the tasks with `get`.
      System.out.println(Ray.get(objectRefList));  // [0, 1, 4, 9]
    }

    {
      List<ActorHandle<Counter>> counters = new ArrayList<>();
      // Create 4 actors from the `Counter` class.
      // They will run in remote worker processes.
      for (int i = 0; i < 4; i++) {
        counters.add(Ray.actor(Counter::new).remote());
      }

      // Invoke the `increment` method on each actor.
      // This will send an actor task to each remote actor.
      for (ActorHandle<Counter> counter : counters) {
        counter.task(Counter::increment).remote();
      }
      // Invoke the `read` method on each actor, and print the results.
      List<ObjectRef<Integer>> objectRefList = counters.stream()
          .map(counter -> counter.task(Counter::read).remote())
          .collect(Collectors.toList());
      System.out.println(Ray.get(objectRefList));  // [1, 1, 1, 1]
    }
  }
}

 

相關文章