ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Transformers] 파이썬 트랜스포머 사용 중 no module named 'keras.saving.hdf5_format' 발생시 해결하는 방법
    Python/Transformers 2023. 4. 7. 13:12
    반응형

    Transformers 사용 중 no module named 'keras.saving.hdf5_format' 발생시 해결하는 방법


    최근 자연어 처리(Natural Language Processing, NLP) 모델을 배우고 있습니다. 제가 원래 기계학습(Machine Learning, ML) 모델을 잘 다루던 사람이긴 하지만, 언제나 남이 짜 놓은 모델을 쓰는건 어렵다는걸 느끼게 됩니다. 그래서, 어디 쉬운 패키지가 업나 해서 찾아보니, 허깅페이스(HuggingFace🤗)에서 제공하는 트랜스포머(Transformers)라는게 하나 있더라고요. 딥러닝 프레임워크는 유행을 많이 타는 편인데, 최근에는 이런 경향이 있습니다.

    • 알파고로 유명해진 텐서플로우(Tensorflow)의 약진이 있었다가,
    • 이후 파이토치(Pytorch)의 상승세가 보이고 있습니다.

    이 때문에 초보 개발자들은 배울거리가 많습니다. 게다가 기계학습 계열에서는 사실상 표준과 같이 사용되던 넘파이(Numpy)도 일부 JAX로 대체되는 경향이 있어, 프레임워크에 얽매이지 않는 코딩 방법이 있다고 하면 모두가 환영할 만한 분위기가 갖추어졌습니다.

    그리고, 이런 수요에 힘입어 허깅페이스가 많은 인기를 끌기 시작했습니다. 텐서플로우로 만든 모델이건 파이토치로 만든 모델이건 간에 허깅페이스의 트랜스포머를 사용할 수 있다면 똑같은 파이프라인 안에서 모델 이름만 바꿔 쓸 수 있기 때문입니다. 저도 기존에 사용하던 딥러닝 파이프라인 대신 허깅페이스 트랜스포머를 사용해보니 제법 편리하게 느껴지더라고요.


    하지만, 최근에 트랜스포머 패키지를 사용하던 도중 문제가 하나 생겼습니다. 텐서플로우 기반의 패키지를 사용할 때마다 나오는 정체 모를 에러 메시지 때문이죠. 이 메시지를 살펴보면, 다음과 같습니다.

    ModuleNotFoundError: No module named 'keras.saving.hdf5_format'

    에러를 그대로 읽어보면, 케라스(Keras)의 saving.hdf5.format이 없다는 말입니다. 그런데 저는 텐서플로우와 케라스 최신 버전을 설치하고 있기 때문에 단순히 생각해서는 케라스 모듈이 없다는게 말이 되지 않습니다. 그래서, 관련 문제를 찾아보니, 오히려 최신 버전의 텐서플로우에서 발생하는 문제라고 하더군요. 그러면 둘 중에 하나를 선택해야 합니다.

    • 텐서플로우를 옛날 버전으로 다운그레이드하거나,
    • 문제가 되는 모듈을 직접 수정하거나

    저는 후자를 선택했습니다. 적어도 파이썬에서는 다양한 패키지가 의존성을 가지고 있기 때문에, 버전을 변경한다는 것은 엄청나게 신중히 선택해야 하는 일이거든요. 모듈 정보를 수정하는것도 비슷한 위험성이 있지만, 코드 몇 글자 건드리는건 되돌리기 쉬우니까 이 쪽으로 생각을 해 봤습니다.

     


    텐서플로우는 파이썬이 설치된 환경에 따라 경로가 다르기 때문에, 에러 메시지에 표시된 경로를 찾아가 줘야 합니다. 에러 메시지 사이에 File (파일 경로)/modeling_tf_utils.py 라고 적힌 곳을 찾아가주면 됩니다.

     


    그 다음에는 modeling_tf_utils.py 파일을 수정해 주는거죠. 문제가 되는 코드는 아래와 같은데, 이 코드를 통째로 주석 처리(#)해 주면 됩니다.

    from keras.saving.hdf5_format import save_attributes_to_hdf5_group

     

    이후, 파일을 저장하고 작업 중이던 커널을 다시 시작한 뒤, 문제가 되는 모델을 다시 불러와보면 제대로 실행되는 것을 확인할 수 있습니다. 사실, 이런 문제는 꼭 트랜스포머 패키지가 아니더라도 패키지 불러오기 관련 문제가 있을 때 손쉽게 해결할 수 있기 때문에 필요에 따라서 주석 처리를 했다가 되살리는 식으로 임시방편 해결책을 시도해볼 수 있습니다. 물론, 가장 확실한 해결방법은 업데이트를 하면서 의존성 문제를 해결하는 것이기 때문에 패키지 관리자 측으로 제보를 해 주는게 좋습니다.

    반응형

    댓글

문의: jwkang3929@naver.com