Hello world!

MLOps

Protocol Buffers, Protobuf

xyz1 2022. 4. 28. 11:13

protobuf(library) 개념에 대해 알아보자

공식 문서: https://developers.google.com/protocol-buffers

protobuf(protocol buffers) 란?

프로토콜 버퍼는 구조화된 데이터를 직렬화 하는 방식이며 라이브러리이다.
구글에서 개발했으며, 15년 정도 개발 과정을 겪었다.
버전은 2가지로 존재한다.proto2, proto3(더많은 언어 지원)

 

장단점

장점:
    •크기(용량)가 작으며 JSON 보다 빠르다.
    •Native language binding을 제공한다
        •Native language: 컴퓨터가 이해할 수 있는 언어 ex.Binary는 컴퓨터가 이해할 수 있는 언어이다
        •Language binding: 두개의 프로그램 언어의 연결(binding), 따라서, C언어로 작성된 라이브러리를 python에서 사용할 수 있다.
    •Cross-language Compatibility
        •지원되는 언어: C++, C#, Java, Kotlin, PHP, Python, Ruby, Objective-C, Dart, Go
        •같은 메시지를 다른 언어로 읽을 수 있다.

단점:
    •데이터를 한번에 메모리에 올려야 하기 때문에, few megabytes를 넘기면 사용하지 않는 것을 권장한다.

 

구조

[그림1. proto 파일을 파이썬 코드로 컴파일하여 example_pb2.py를 떨군다]

 

그림1에서 볼 수 있듯이 proto파일에 있는 message juhwan에 관련된 field의 값들이 compiler를 통해 serialized 된 채로 저장이 된다.

.proto (JSON파일 처럼 구조화 된 데이터를 표현한다.)

protoc는 protobuffer의 compiler이다.

[그림2. example_pb2.py를 통해 데이터 읽기 및 쓰기]





 

활용 사례

#TFX에서는 어떻게 사용되는지 알아보자.

1. Arguments 전달


TFX에는 .proto 파일은 미리 만들어져 있으며 해당 .proto에 대한 compiled *_pb2.py 도 존재한다.

Ex) trainer_pb2.py

[그림3. TFX template에 있는 trainer_pb2.py ]



해당 파일에는 train 과정에 필요한 arguments들이 binary 형태로 저장되어 있다.

추후에, 실제 pipeline의 train를 실행시킬 때 아래 [그림4]에서 나타나듯이 데이터를 deserialize 한다.

[그림4. trainer_pb2.py를 사용하여 train arguments 전달 ]



 

2. Output file

TFX components의 결과물로 protobuf 를 자주 마주치게 된다.
ex. saved_model.pb

[그림5. pb 파일 예제]



파일이름에 pb는 protobuf를 의미하며 binary 형태의 파일이다.

위의 1번 활용 예제는 example_pb2.py 파일 안에 데이터가 byte-string으로 있었지만 saved_model.pb 파일은 .py 파일이 아니다.

무엇이 다른 것일까?
쉽게 설명하자면, *.pb 파일은 위의 1번 활용예제의 trainer_pb2.py 안에 있는 binary 데이터만 저장되어있는 형태인 것이다.
그림으로 설명하면 아래 그림과 같다.

[그림6. pb파일과 trainer_pb2.py]

 

이 시점에서 문득 이런 생각이 떠오를 것이다. 이번에는 .pb 파일을 deserialize와 serialize를 어떻게 하지? 왜냐하면, 1번 예제에서는 trainer_pb2.py를 import해서 de/serialize를 진행했지만, 이 경우에는 없기 때문이다.
정답은 TFX 라이브러리에서 자체적으로 .pb 파일에 대한 .py 파일을 가지고 있다.
실제로, 코드로 테스트하면서 알아보고 싶었지만.. debug 과정에서 에러가 계속 발생해서 실습은 더 이상 진행하지 않았다.

결론

protobuf는 데이터를 de/serialize 하기 위한 라이브러리이며,
protobuf의 workflow를 이해하기 위해서 .proto, compiled file(*_pb2.py)의 파일들이 필요했다.
TFX에서는 .proto, compiled file이 미리 구현이 되어있어서 편리하다.공식 문서: https://developers.google.com/protocol-buffers

 

'MLOps' 카테고리의 다른 글

TFX components  (0) 2022.07.27
TFX ML Metadata  (0) 2022.05.03
TFX Guide Local pipeline example  (0) 2022.04.25
Practitioners guide to MLOps  (0) 2022.04.25
TFX paper  (0) 2022.04.22