Ray, Apache Arrow, zero-copy

햄도·2021년 8월 12일
1

분산/병렬 ML 프레임워크인 Ray에 대해 알아보다가, 직렬화 오버헤드가 적은 Apache Arrow를 사용하여 Zero-Copy 직렬화를 수행한다는 것이 이해가 되지 않아 조사한 내용.

Apache Arrow란?

언어, 플랫폼과 상관없이 메모리 상에서 컬럼 구조로 데이터를 정의하여, CPU와 GPU에서 메모리를 빠르게 읽고 쓸 수 있도록 한다.


이미지 출처

컬럼 구조로 데이터가 구성되기 때문에 SIMD(Single instruction multi data) 명령어같이 인텔 cpu를 벡터화해서 활용할 수 있는 기능을 제공한다.

여러 카산드라, h베이스, 임팔라, 스파크 등 아파치 빅데이터 프로젝트 관련 개발사가 프로젝트에 참여했기 때문에 데이터를 메모리에 빠르게 올릴 수 있을 뿐만 아니라 다양한 플랫폼에서 변환 없이 사용할 수 있다.


이미지 출처

Zero-copy 직렬화란?

기존에는 서로 다른 데이터 인프라가 데이터를 공유하기 위해서는 serialization/deserialization이 필요했다. 즉 python에서 정의한 특정 객체를 다른 플랫폼으로 보내 데이터를 공유하려면 공통의 형식으로 바꿔주는 단계가 있어야 했고, 공통 형식으로 바꿔준 후 해당 플랫폼에 도착하면 다시 그 플랫폼에 맞는 형태로 바꿔주는 deserialization 또한 필수였다.

하지만 요즘같이 어마무시한 양의 데이터가 다양한 플랫폼을 오고가는 상황에서 이 serialization과 deserialization 단계는 병목이 되어버린다😨 그래서 serialization 과정을 없애버리자는 목적으로 Apache Arrow, FlatBuffers와 같은 zero-copy serialization framework가 생기게 되었다.

이런 프레임워크들은 serialization step을 없애기 위해 객체를 가지고 작업하는 대신 직렬화된 데이터 자체를 가지고 작업한다. 이렇게 하면 당연히 네트워크를 통해 전송될 때에도 serialization 을 거치지 않기 때문에 훨씬 효율적이며 데이터를 받는 쪽에서도 deserialization을 하지 않아도 된다. 매우 좋아보인다🤩

하지만 여기에도 단점이 있다. 이런 방식을 사용하면 idiosyncrasy(특질? 한국어로 뭐라고 하는지 모르겠다🙄)를 잃게 된다. 모든 동작이 byte buffer에 직접 수행되기 때문에 고유한 data type은 무시되고 모든 데이터가 sequence of bytes로 처리된다. 물론 이런 바이트 형태의 데이터를 다시 integer, array 등 객체로 바꿔줄 수 있지만 그렇게 하면 deserialization을 함으로써 zero-copy의 이점을 없애는 셈이 된다.

Ray와 zero-copy 직렬화는 무슨 상관?

Ray는 분산/병렬 컴퓨팅을 수행할 수 있도록 만들어진 프레임워크이고, 여러 프로세스를 만들어 작업을 수행하다 보면 프로세스 간에 객체를 공유해야 하는 상황이 생긴다.

기존 python의 multiprocessing은 큰 데이터를 다른 프로세스에 전달할 때 pickle을 사용하여 직렬화한 뒤 전달하는데, 이렇게 하려면 모든 프로세스가 그 데이터의 복사본을 만들어야 하고, deserialization 시 발생하는 부하를 무시할 수 없다.

그래서 Ray는 zero-copy serialization을 사용하기 때문에 부하가 적은 Apache arrow를 사용하여 직렬화한다는 의미였다🧐

기타 생각

요즘 나오는 오픈소스들을 보면 다른 오픈소스 위에 오픈소스를 얹고, 또 그 위에 뭘 얹고 하는 구조처럼 보이는데 잘 모르는 내가 보기엔 의존성 관리를 어떻게 하나 싶다.

나는 Ray에만 의존하고 싶은데 Ray는 Arrow에 의존을 하고 있고, 또 Arrow는 다른 오픈소스에 의존을 하고 있고, 그런데 그 중 하나가 (그럴 일은 없겠지만) deprecate 된다거나 하면 어떻게 되는걸까? 보통은 대응할 수 있는 수단도 제공을 해주겠지만, 서비스의 많은 부분이 그 deprecated된 기능에 의존하고 있었다면 곤란할 것 같다😓

오픈소스를 도입할 때에는 이런 점도 고려해야겠다. sqlite는 직접 만들 수 있는 자유를 위해서 C 컴파일러와 libc 이외에는 어떤 것에도 의존하지 않고 개발되었다는 글을 읽은 적이 있다. 극단적인 예시이긴 하지만.. 충분히 생각해볼 수 있는 내용이다.

참고

profile
developer hamdoe

0개의 댓글