나의 이야기

huggingface/transformers에 컨트리뷰트 해보기

seokhyun2 2022. 5. 28. 17:44

자연어처리를 공부해보았다면 누구나 경험해보았을만큼 유명한 huggingface의 transformers에 contribute를 해보았습니다.

처음으로 오픈소스에 컨트리뷰트 해보아서 머지가 되고, 릴리즈에 포함이 되었을 때는 너무나도 뿌듯함을 감출 수 없었습니다.

그래서 오늘은 컨트리뷰트했던 과정을 남겨두고자 합니다.

 

1. 컨트리뷰트하게 된 계기

최근 deep learning 모델을 서빙하면서, onnx를 필수로 사용을 하고 있습니다.

huggingface의 transformers에서는 쉽게 onnx로 변경 할 수 있는 모듈(https://huggingface.co/docs/transformers/main/en/serialization#onnx)을 제공하고 있습니다.

가이드를 보면, 아래와 같이 transformers의 onnx 모듈을 실행하면 자동으로 모델이 변환되는데요.

python -m transformers.onnx --help

usage: Hugging Face Transformers ONNX exporter [-h] -m MODEL [--feature {causal-lm, ...}] [--opset OPSET] [--atol ATOL] output

positional arguments:
  output                Path indicating where to store generated ONNX model.

optional arguments:
  -h, --help            show this help message and exit
  -m MODEL, --model MODEL
                        Model ID on huggingface.co or path on disk to load model from.
  --feature {causal-lm, ...}
                        The type of features to export the model with.
  --opset OPSET         ONNX opset version to export the model with.
  --atol ATOL           Absolute difference tolerence when validating the model.

변환하고자 하는 모델을 지정하고, transformers에서 제공되는 것들 중에 원하는 task를 feature로만 넣어주시면 됩니다.

위의 모듈을 사용하여 electra 모델을 변환하려고 했었는데, 지원되는 모델 중에 electra는 없었기에 별도로 onnx 변환하는 코드를 작성하다가 갑자기 오픈소스 컨트리뷰트를 해보고 싶다는 생각이 들어서 transformers 코드를 수정해보게 되었습니다.

 

2. 과정

https://github.com/huggingface/transformers

 

GitHub - huggingface/transformers: 🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX.

🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. - GitHub - huggingface/transformers: 🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, a...

github.com

과정을 정리해보면 위의 repository를 먼저 차근차근 살펴보니 contribute guide(https://github.com/huggingface/transformers/blob/main/CONTRIBUTING.md)가 따로 제공되고 있었습니다.

다른 많은 유명한 레포지토리들도 누구나 기여할 수 있도록 contribute guide를 제공하고 있다는 것을 알 수 있었습니다.

혹시라도 오픈소스에 컨트리뷰트를 해보고 싶으시다면, 레포에 가이드가 있는지 먼저 확인해보시는 것을 추천드립니다!

 

transformers에서는 아래와 같은 경우들에 컨트리뷰트를 할 수 있다고 적혀있었는데요.

저의 경우에는 맨 마지막 줄에서 desired new features에 해당되지 않을까 합니다.

가이드에 컨트리뷰트 방법도 자세하게 적혀있었는데요.
간단히 적어보면, huggingface/transformers를 먼저 fork를 하여 개인계정으로 복사한 후에 fork한 레포지토리에서 branch를 추가하고 작업을 한 후에 테스트 코드들을 모두 실행해보고 이상이 없으면 Pull Request를 생성하여 review를 받는 시스템이였습니다.

회사에서도 코드를 작성할 때, 신규 feature에 대해서 branch를 생성하여 코드를 작성하고 Pull Request를 거쳐서 리뷰가 필요한 경우엔 리뷰를 받고 머지하는 과정을 수행하고 있어서 컨트리뷰트 방식이 비슷하여 어렵지 않게 할 수 있었던 것 같습니다.

 

그래서 저는 onnx 모듈에서 electra도 활용할 수 있도록 작업을 하였기에 electra-onnx-support 라고 branch를 생성하여 작업 후에 Pull Request(https://github.com/huggingface/transformers/pull/15084)를 생성했었습니다.

두 분이 review를 해주셨는데, 먼저 리뷰주신 한 분이 test case를 추가해달라고 요청하셔서 추가적으로 작업해서 push를 하였고 나머지 한 분은 좋다고만 적어주셔서 저의 Pull Request는 생각보다 쉽게 merge 될 수 있었습니다.

 

merge가 되고, 시간이 좀 흐른 후에 새로운 release 버전(https://github.com/huggingface/transformers/releases/tag/v4.18.0)에서 제 Pull Request가 포함이 되었습니다. release 문서에는 저렇게 새로운 컨트리뷰터라고 멘션을 해주어 알림도 왔습니다.

 

3. 느낀점

오픈소스 컨트리뷰트는 정말 어렵고 대단한 일이라고만 생각하고 있었는데, 한번쯤 도전해보고 싶다는 생각은 계속 하고 있었습니다.

그러다가 갑자기 내가 할 수 있을 만한 코드 작업이 안되어 있는 것을 발견하여 기회라고 생각하고 작업을 해보았습니다.

막상 작업을 해보니, 회사에서 코드를 개발하는 과정이랑 비슷하였고 단지 회사에서는 기획에 의한 코드 작업이냐, 오픈 소스에서는 내가 찾아서 작업을 하는 것이냐에 대한 차이만 있었습니다.

꽤 유명한 레포지토리에 리뷰를 받고 코드가 머지되고 릴리즈에 포함이 되고, fork 해 온 레포지토리에 모르는 사람이 star까지 받아보니 정말 뿌듯했고 해 본 사람만이 알 수 있는 기분이라고 말할 수 있을만큼 정말 새로운 감동이였습니다.

오픈 소스를 사용하다가, 버그를 발견하였거나 추가해보고 싶은 기능이 있다면 주저하지 않고 도전해보시는 것을 추천드립니다!

'나의 이야기' 카테고리의 다른 글

글또 8기 다짐  (0) 2023.02.12
글또 7기 회고  (0) 2022.10.14
글또 7기 다짐글  (0) 2022.05.11
글또 5기 회고  (0) 2021.05.02
글또 5기 다짐  (0) 2020.11.14