호기심에 대한 레이

딘 워플러

팔로우

2019 년 12 월 19 일·10 분 읽기

(개선,2 월 8, 2020)

이것은 수학적으로 정확한 유형 계층구조인,강력한 타입을 정의합니다. 이 게시물은 레이가 해결하는 문제와 사용 방법에 대해 설명합니다.

레이 프로젝트 로컬,
에서 사용할 수있는 레이 프로젝트https://ray.io

레이(웹 사이트,깃허브)큰 클러스터에 단일 시스템에서 파이썬 응용 프로그램을 확장하기위한 오픈 소스 시스템입니다. 그 디자인은 다양한 계산 패턴,분산 상태 관리,진화하는 상태 관리,최소한의 프로그래밍 노력으로 이러한 모든 요구를 해결하려는 욕구 등 여러 가지 고유 한 과제에 직면 한 차세대 기계 학습/인공 지능 시스템의 고유 한 요구에 의해 주도됩니다.

일반적인 기계/인공지능 시스템은 데이터 정리 및 준비,하이퍼파라미터 튜닝,모델 교육 및 제공,기타 작업을 지원하기 위해 다양한 계산 패턴을 필요로 한다. 빅 데이터 워크로드의 원래 맵리 듀스 모델은 데이터 정리,준비 및 분석 워크로드에 적합하지만 기계 학습 워크로드는 구성 요소 간의 다양한 통신 패턴과 함께 세분화 된 작업과 거친 작업의 혼합물을 필요로합니다. 하이퍼파라미터 튜닝 및 모델 교육은 컴퓨팅 집약적이므로 클러스터 리소스가 적절한 시간 내에 완료되어야 합니다. 레이는 이러한 다양한 요구 사항을 최소한의 직관적인 방식으로 충족함으로써 최신 머신러닝/인공지능 시스템 및 애플리케이션을 구축할 수 있는 기반을 제공합니다.

두 번째 도전은 상태를 진화,배포됩니다. 의 맥락에서 기계 학습/인공 지능,분산 상태 포함 하이퍼 매개 변수,모델 매개 변수(예:강화 학습 시나리오,시뮬레이션 상태(또는 실제 세계와의 상호 작용)훈련에 사용됩니다. 특히 교육 중에 상태를 변경할 수있는 경우가 많으므로 조심스럽고 동시성으로 안전한 업데이트가 필요합니다. 분산 컴퓨팅을 처리하는 한 가지 가능한 방법은 인기있는”서버리스”시스템을 이용하는 것이지만 현재 분산 된 변경 가능한 상태를 관리하기위한 기능을 제공하는 것은 없습니다. 개발자는 서비스리스 시스템을 사용할 때 데이터베이스의 모든 상태를 유지해야 하지만 데이터베이스는 병목 현상 및 단일 장애 지점이 될 수 있습니다.

대신 레이는 인기 배우 모델을 사용하여 상태 관리를위한 직관적 인 메커니즘을 제공합니다. 레이 액터는 상태 비저장인 레이 작업에 대한 상태 저장 보완을 제공합니다. 이 상태는 해당 파이썬 객체(즉,파이썬 클래스의 인스턴스)에 대한 참조를 통해 다른 레이 액터 또는 작업에 투명하게 도달 할 수 있습니다. 레이는 클러스터에서 행위자의 위치를 추적하므로 사용자 코드에서 이러한 위치를 명시적으로 알고 관리할 필요가 없습니다. 행위자의 상태 변이는 명시적 동시성 프리미티브가 필요하지 않고 스레드로부터 안전한 방식으로 처리됩니다. 따라서 레이는 응용 프로그램에 대해 직관적이고 분산된 상태 관리를 제공하므로 레이는 일반적으로 상태 저장 서버리스 응용 프로그램을 구현하기 위한 훌륭한 플랫폼이 될 수 있습니다. 또한 동일한 머신의 행위자 또는 작업 간에 통신할 때 최적의 성능을 위해 행위자와 작업 간에 0 복사 직렬화를 사용하여 공유 메모리를 통해 상태를 투명하게 관리합니다.

마지막으로,대부분의 기계/인공지능 시스템은 파이썬 기반이기 때문에 개발자들은 최소한의 코드 변경으로 이러한 스케일 아웃 기능을 추가할 수 있는 방법이 필요하다. 데코레이터@ray.remote는 함수와 클래스를 클러스터에서 인스턴스화하고 실행할 수 있는 논리 단위로 표시합니다. 레이는 스레드로부터 안전한 상태 변이,상태 분포 및 종속 작업의 직관적인 스케줄링을 투명하게 처리합니다.

광선 분포에는 인공지능 애플리케이션을 대상으로 하는 여러 고성능 라이브러리가 포함되어 있으며,이는 또한 광선의 생성을 유도하는 문제를 야기했다. 여기에는 강화 학습 및 하이퍼 파라미터 튜닝을위한 튜닝이 포함됩니다. 둘 다 레이의 독특한 능력을 보여줍니다. 이러한 라이브러리 및 레이와 함께 작성된 다른 사용자 지정 응용 프로그램은 이미 많은 프로덕션 배포에 사용됩니다.

레이는 버클리 리셀랍에서 시작된 오픈소스 프로젝트입니다. 그것은 지금 많은 다른 조직에서 큰 기여와 함께 아니 스케일에서 개발되고있다. 레이의 상업 사용자는 개미 금융,일본 모건,인텔,마이크로 소프트,에릭슨,스카이 마인드,프라이머,그리고 많은 다른 사람을 포함한다.참고:다음 코드 예제의 전체 목록은 이 게시물의 끝에서 찾을 수 있습니다.

이제 레이의 동기와 장점을 이해 했으므로 응용 프로그램에서 레이를 사용하는 방법을 살펴 보겠습니다. 그런 다음 광선이 병렬화 및 분포를 통해 성능을 향상시키는 방법에 대해 자세히 살펴 보겠습니다. 사용자가 클러스터 전체에서도 코드 변경을 최소화하면서 응용 프로그램을 확장할 수 있도록 신중하게 설계되었습니다.

클러스터에서 기계 학습 모델을 학습하는 데 사용되는 키-값 저장소인 매개 변수 서버의 예를 생각해 보십시오. 값은 기계 학습 모델의 매개 변수입니다(예:,신경망). 키는 모델 매개 변수를 인덱싱합니다. 매개 변수 서버에 익숙하지 않은 경우 정보 또는 데이터에 대한 요청을 처리하는 데 필요한 독립 실행형 서비스를 생각해 보십시오.

예를 들어,영화 추천 시스템에는 사용자당 하나의 키와 영화당 하나의 키가 있을 수 있습니다. 각 사용자 및 동영상에 대해 해당 사용자 별 및 동영상 별 매개 변수가 있습니다. 언어 모델링 응용 프로그램에서 단어는 키가 될 수 있으며 해당 임베딩은 값이 될 수 있습니다.

가장 간단한 형태로 매개 변수 서버는 단일 키를 가질 수 있으며 모든 매개 변수를 한 번에 검색 및 업데이트 할 수 있습니다.

다음은 단일 숫자 배열 매개 변수에 대한 간단한 매개 변수 서버의 예입니다. 이 코드는 15 줄 미만의 레이 액터로 구현됩니다:

매개 변수 서버 행위자의 가져오기 및 정의

@ray.remote데코레이터는 서비스를 정의합니다. 일반 파이썬 클래스 인ParameterServer을 사용하여 원격 서비스로 인스턴스화 할 수 있습니다. 인스턴스는 상태(변경 가능한 현재 매개 변수)를 유지하기 때문에 상태 저장 서비스가 있습니다.

이 예제에서는 매개 변수에 대한 업데이트가 현재 매개 변수 벡터에 추가되어야 하는 그라데이션으로 제공된다고 가정합니다. (이 그라데이션은 모든 배열 요소 또는 그라디언트 배열에 추가되는 단일 숫자 일 수 있습니다. 물론 더 정교한 디자인이 가능하지만 레이는 같은 방식으로 사용됩니다. 간단한 연습으로 이것을 키-값(사전)구현으로 변경하십시오.

매개 변수 서버는 일반적으로 원격 프로세스 또는 서비스로 존재합니다. 클라이언트는 원격 프로시저 호출을 통해 상호 작용합니다. 매개 변수 서버를 원격 행위자로 인스턴스화하기 위해 대화형 파이썬 프롬프트에서 다음 단계를 수행합니다. (우리는 당신이 이미 같은 세션에서ParameterServer클래스를 정의했다고 가정 할 것입니다). 먼저,레이를 시작해야합니다. 클러스터를 사용하는 경우 선택적 매개 변수를init()메서드에 전달하여 클러스터 위치를 지정합니다:

파이썬 인터랙티브 세션: 시작 광선

다음으로 10 개의 매개 변수 배열에 대한ParameterServer인스턴스를 만듭니다:

매개 변수 서버 행위자 인스턴스 생성

ParameterServer(10)를 호출하여 인스턴스를 생성하는 대신 일반 파이썬 인스턴스처럼@ray.remote데코레이터가 클래스에 추가한remote()메서드를 사용합니다. 일반 생성자에 전달할 것과 동일한 인수를 전달합니다. 행위자 개체가 생성됩니다.

마찬가지로 액터에서 메서드를 호출하려면 원래 메서드 이름에 추가된remote()을 사용하여 원래 메서드에 전달할 인수와 동일한 인수를 전달합니다:

원격 메서드 호출

액터 메서드 호출은 선물을 반환합니다. 실제 값을 검색하려면 차단ray.get(id)호출을 사용합니다:

레이 값을 검색.(아이디)

예상대로 초기 매개 변수 값은 모두 0 입니다. 실제로ray.get(id)은 레이가 제공하는 분산 상태 저장소 서비스에서 값을 가져오는 것입니다. 이 값은 액터가 상태를 업데이트할 때 분산 상태 저장소에 기록되었습니다. 값과 클라이언트가 모두 동일한 머신에 있는 경우 빠른 성능을 위해 공유 메모리에서 값을 가져옵니다. 값과 클라이언트가 서로 다른 머신에 상주하는 경우 값이 필요한 머신에 인계됩니다.

완전성을 위해 코드는ray.put(id, value)를 사용하여 이 저장소에 값을 명시적으로 쓸 수도 있습니다. 여러 값을 사용할 수 있게 되면 편리한ray.wait(…)기능을 사용할 수 있습니다. 자세한 내용은 참조하십시오.

행위자 모델에 따라 클라이언트가 이러한 행위자 메서드를 호출할 때 호출은 행위자 인스턴스가 클러스터에 있을 때마다 라우팅됩니다. 동시 호출이 발생할 수 있으므로 레이는 각 호출이 스레드로부터 안전한 방식으로 처리되도록 보장하므로 명시적 스레드 동기화 코드가 필요 없이 상태가 손상될 위험이 없습니다. 그러나 이것은 이러한 호출이 처리 될 때의 모든 종류의 전역 순서를 부과하지 않습니다.

주: 파이썬의 동적 특성 때문에 레이는remote()없이 행위자 메서드를 호출할 수 있도록 허용했을 것입니다. 또한,반환 된 객체는 이제 값을 추출하기 위해,차단 호출ray.get()의 사용을 필요로 미래 다르다.

이제 그라디언트를 지속적으로 계산하고 모델 매개 변수를 업데이트하는 여러 작업자 작업을 실행한다고 가정합니다. 각 작업자는 다음 세 가지 작업을 수행하는 루프에서 실행됩니다:

  1. 최신 매개 변수를 가져옵니다.
  2. 매개 변수에 대한 업데이트를 계산합니다.
  3. 매개 변수를 업데이트합니다.

이러한 작업자는 무국적 상태이므로 행위자 대신 광선 작업(원격 함수)을 사용합니다. worker함수는 매개 변수 서버 행위자에 대한 핸들을 인수로 사용하여 작업자 태스크에서 매개 변수 서버에서 메서드를 호출할 수 있습니다:

매개 변수 업데이트

를 수행하는 원격 작업자를 정의한 다음 다음과 같이 두 가지 작업자 작업을 시작할 수 있습니다. 광선 작업(함수)은 동일한remote()호출로 시작됩니다.:

두 작업을 사용하여 매개 변수 업데이트를 동시에 계산

그런 다음 드라이버 프로세스에서 매개 변수를 반복적으로 검색하여 작업자가 업데이트하고 있음을 확인할 수 있습니다:

현재 매개 변수 값에 대한 쿼리를 반복

업데이트가 중지되면 최종 값은 200 이 됩니다.

레이는 파이썬 클래스를 정의하는 것처럼 원격 서비스 또는 액터를 쉽게 시작할 수 있습니다. 행위자에 대한 핸들을 다른 행위자 및 작업에 전달하여 임의적이고 직관적 인 메시징 및 통신 패턴을 허용 할 수 있습니다. 현재의 대안은 훨씬 더 관련이 있습니다. 예를 들어,이 설명서에서와 같이 동등한 런타임 서비스 생성 및 서비스 핸들 전달이 어떻게 수행되는지 고려하십시오.작업 및 행위자 통합

우리는 작업과 행위자가 동일한 레이를 사용하고 동일한 방식으로 사용되는 것을 보았습니다. 병렬 작업 및 행위자의 이러한 통합은 광선 사용을 단순화하고 구성을 통해 강력한 응용 프로그램을 구축하는 데 중요한 이점이 있습니다.

비교의 방법으로,아파치 하둡과 아파치 스파크와 같은 인기있는 데이터 처리 시스템은 불변의 데이터에서 작동하는 상태 비저장 작업(부작용이없는 기능)을 할 수 있습니다. 이 가정은 전체 시스템 설계를 단순화하고 응용 프로그램이 정확성을 쉽게 추론 할 수있게합니다.

그러나 기계 학습 응용 프로그램에서 공유 변경 가능한 상태가 일반적입니다. 이 상태는 신경 네트워크의 가중치,타사 시뮬레이터의 상태 또는 물리적 세계와의 상호 작용 표현 일 수 있습니다. 레이의 액터 추상화는 스레드 안전 방식으로 변경 가능한 상태를 정의하고 관리하는 직관적 인 방법을 제공합니다.

이것을 특히 강력하게 만드는 것은 레이가 행위자 추상화를 두 접근법의 이점을 상속하는 작업 병렬 추상화와 통합하는 방법입니다. 레이는 기본 동적 작업 그래프를 사용하여 동일한 프레임 워크에서 행위자와 상태 비저장 작업을 모두 구현합니다. 결과적으로,이 두 추상화는 완전히 상호 운용 가능합니다. 작업 및 행위자는 다른 작업 및 행위자 내에서 만들 수 있습니다. 둘 다 자연스럽게 스케줄링 및 데이터 종속성을 도입하기 위해 다른 작업 또는 행위자 방법으로 전달 될 수있는 선물을 반환합니다. 그 결과,레이 응용 프로그램은 작업 및 행위자 모두의 최고의 기능을 상속합니다.

동적 태스크 그래프:원격 함수 또는 액터 메서드를 호출하면 태스크가 동적으로 증가하는 그래프에 추가되며,이 그래프는 레이가 클러스터(또는 단일 멀티 코어 머신)에서 스케줄링하고 실행합니다. 작업은”드라이버”응용 프로그램 또는 다른 작업에 의해 생성 될 수있다.

데이터:레이는 아파치 화살표 데이터 레이아웃을 사용하여 데이터를 효율적으로 직렬화합니다. 개체는 공유 메모리를 통해 동일한 머신의 작업자와 행위자 간에 공유되므로 복사본이나 역직렬화가 필요하지 않습니다. 이 최적화는 좋은 성능을 달성하는 데 절대적으로 중요합니다.

스케줄링:레이는 분산 스케줄링 방식을 사용합니다. 각 컴퓨터에는 해당 컴퓨터의 작업자와 행위자를 관리하는 자체 스케줄러가 있습니다. 작업은 응용 프로그램 및 작업자가 동일한 컴퓨터의 스케줄러에 제출합니다. 거기에서 다른 작업자에게 재 할당되거나 다른 로컬 스케줄러로 전달 될 수 있습니다. 이를 통해 레이는 중앙 집중식 스케줄러,잠재적 병목 현상 및 단일 장애 지점으로 달성 할 수있는 것보다 훨씬 높은 작업 처리량을 달성 할 수 있습니다. 이것은 많은 기계 학습 응용 프로그램에 필수적입니다.

결론

매개 변수 서버와 같은 시스템은 일반적으로 배포,호출,상태 관리 등을 처리하기위한 상용구가 될 수있는 사소한 양의 코드를 가진 독립형 시스템으로 구현 및 배송됩니다. 우리는 레이의 추상화와 기능을 통해 대부분의 상용구를 제거 할 수 있음을 보았습니다. 따라서 모든 기능 향상은 비교적 쉽고 생산성이 극대화됩니다.

오늘날의 프로덕션 환경에서 필요한 많은 공통 서비스를 이러한 방식으로 신속하고 효율적으로 구현할 수 있습니다. 예로는 로깅,스트림 처리,시뮬레이션,모델 제공,그래프 처리 등이 있습니다.

난 당신이 레이 흥미로운 짧은 소개를 발견 희망. 그것을 시도하고 당신이 어떻게 생각하는지 알려 주시기 바랍니다!

레이에 대한 자세한 내용은 다음 링크를 참조하십시오:

  • 레이 웹사이트
  • 레이 문서:랜딩 페이지,설치 지침
  • 레이 자습서
  • 레이 시스템을 자세히 설명하는 연구 논문
  • 딥 러닝을 위한 레이 내부의 유연한 프리미티브를 설명하는 연구 논문
  • 조정:레이
  • 조정:레이
  • 조정:레이
  • 흐름:레이
  • 흐름:레이
  • 흐름:레이
  • 흐름:레이
  • 흐름:레이
  • 흐름:레이
  • 흐름:레이
  • 흐름:레이
  • : 교통 제어 모델링을위한 강화 학습을 사용하는 전산 프레임 워크

  • 아니 스케일:레이 뒤에 회사

질문은 레이 담론 또는 레이 슬랙 작업 공간으로 이동해야합니다.

부록:코드 실행

전체 응용 프로그램을 실행하려면 먼저pip install ray로 레이를 설치하십시오(또는 레이 설치 지침 참조). 그런 다음 파이썬으로 다음 코드를 실행하십시오. 앞에서 설명한 대로 매개 변수 서버를 구현하지만 작업자의 매개 변수 분할을 추가합니다. 이 예제의 더 광범위한 버전을 여기에서 주피터 노트북으로 찾을 수도 있습니다.

이 예제는 단순성에 중점을두고 있으며이 코드를 최적화하기 위해 더 많은 작업을 수행 할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.