ImportError: cannot allocate memory in static TLS block
나는 이 문제를 한번도 만난 적이 없는데,
어떤 팀원은 몇달 전에도 최근에도 이 문제를 만나곤 했다.
visual-radio | ImportError: /usr/local/lib/python3.10/site-packages/tensorflow/python/platform/../../../tensorflow_cpu_aws.libs/libgomp-cc9055c7.so.1.0.0: cannot allocate memory in static TLS block
왜 또다시 누군 되고 누군 안되는 문제가 일어났을까?
결론은, M1, M2 CPU에서 tensorflw가 정상 동작하려면 python 3.8 버전을 사용해야 적절했다.
그래서 3.10에서 3.8로 도커 이미지를 변경하였더니 해결되었다.
cannot allocate memory 문제가 보였기 때문에, 메모리 측면에서 많은 고민을 했다. 안 그래도 우리 서버를 돌릴때 메모리 용량이 아슬아슬하게 돌아갔기 때문에, 가장 의심이 되는 부분이었다. 그러나 모든 시도는 실패했다.
▼ 시도해보았지만 실패했던 것들
- docker 용량 최대한 확보하기 (메모리 할당 문제니까 가장 먼저 시도해봄)
- export로 환경변수를 올바르게 설정해보기
- 기존 이미지, 컨테이너, 캐시 등 깔끔히 삭제 후 docker-compose build 다시 해보기
- 도커 재설치
- import위치를 조정하는 해결책도 있었다. 이것도 안된다고 하더라.
- static TLS block이 뭔지, libgomp는 뭔지, 저 경로에는 뭐가 있는지 찾아보면서 고민해보기
오랫동안 여러 시도를 했는데 쉽사리 풀리지 않았다.
그래서 이제 TLS... 라는 글자만 봐도 막막한 기분이 들더라.
이런 것들로 해결되지 않아서 다시 찬찬히..
고민고민고민 & 검색에 들어갔다.
해결에 다가간 고민 과정
1. window와 mac은 cpu가 다름 & docker는 호스트 시스템에 영향을 받음
팀원 컴퓨터에서는 안되고, 내 컴퓨터에서는 되는 원인을 최근에 하나 찾은 적이 있다.
내 시스템 플랫폼은 amd64고 팀원은 M2로서 arm64 기반 플랫폼을 사용한다는 것이다. (arm64/v8)
그리고 도커 이미지마다 지원하는 플랫폼이 다르다는 것!
=> 즉 cpu 아키텍처를 고려해야 함
이것이 문제라는 것을 알아내기 전까지는 그저 유명한 이미지 갖다쓰면 아무 문제없이 자유롭게 사용 가능한 줄 알았다. 그러나 도커는 호스트 시스템 위에서 돌아가기 때문에 영향을 받는다는 것을 깨달았다.
그래서 좀 더 검색해봤는데,
tensorflow를 설치할 때도 arm64보드용 tensorflow를 설치해야 한다는 것을 알았다. (즉 tensorflow-aarch64를 깔아야 함)
(AArch64 혹은 ARM64는 ARM의 64비트 확장 명령어셋 아키텍처를 의미)
그러고보니 종종 어떤 라이브러리를 설치할 때,
맥용 윈도우용 리눅스용 설치 파일명이 달랐던 것이 이제 기억난다.
2. M1은 tensorflow를 사용할 때 python3.8만 지원한다는 정보를 입수
(뒤늦게 안 사실이지만 팀원은 M2임)
그래서 tensorflow의 정상 작동을 위해서는 3.10이 아닌 3.8을 설치해야 한다.
아 이런 문제도 있을 수 있겠구나!
3. OS에 따라 TLS 문제 터지고 안터지고 한다는 정보 얻음
동일한 문제는 아니지만, 아래 에러에 대한 어떤 사람의 추측 코멘트가 도움이 되었다.
ImportError: dlopen: cannot load any more object with static TLS
이 오류에 대한 추측 코멘트였다.
OS마다 오류가 뜨고 안뜨고가 달랐다고! ubuntu에서는 안됐고 centos에서는 됐다는.. maybe...!
그래서 세우게 된 해결책!
>> 파이썬 버전 변경 <<
기존 이미지: python:3.10-buster
변경 이미지: python:3.8-buster
해.결.완.료
좀 많이 뿌듯했다.
'컴퓨터구조 & OS' 카테고리의 다른 글
Linux gpu 세팅[2] | 기존 컨테이너에서 GPU 사용하도록 변경하기 (2) | 2023.09.08 |
---|---|
[WSL와 VM의 차이점] 하이퍼바이저를 이해하며.. (2) | 2023.09.07 |
도커는 호스트 시스템에 영향을 받는다 1편 - platform 속성? amd64와 arm64/v8 (CPU 아키텍처) (2) | 2023.07.05 |
[컴퓨터구조] 파이프라이닝 | 개념, 성능, 문제점 (0) | 2021.11.19 |
[컴퓨터구조] 16비트 컴퓨터에서 프로그래밍하기 - Assembler가 어셈블리 프로그램을 기계어로 번역하는 과정 (0) | 2021.10.18 |