(Stable Diffusion 3.0 모델로 생성한 이미지입니다.)
회사에서 파이썬으로 개발환경을 세팅하고 있었습니다. 정확히는 pip 를 활용해서 필요한 라이브러리를 설치하고 있었고 제가 설치해야 했던 라이브러리는 tensorflow 2.0.0 버전이었기에 pip install tensorflow==2.0.0
명령어를 통해 설치하려 했습니다. 그런데 아래와 같이 없다고 뜨는 겁니다!
Could not find a version that satisfies the requirement
아니 PyPI 페이지에 Release History 정확히 2.0.0 이 있는데 나를 장님취급 하나!!! 찾질 못하는 건가해서 Download files 로 직접 wheel
파일을 가져와 아래와 같이 설치해주기로 했습니다.
$ pip install tensorflow-2.0.0-cp27-cp27mu-manylinux2010_x86_64.whl
그 결과는 아래와 같았습니다.
tensorflow-2.0.0-cp27-cp27mu-manylinux2010_x86_64.whl is not a supported wheel on this platform
지금 장난하나....Python 2.7 버전, 리눅스(당시 저는 Rocky Linux), 64비트 아키텍처 모두 부합하는데요...
내가 뭘 잘못 알고 있나 해서 각각 python -V
, cat /etc/*-release
, cat /proc/cpuinfo
로 찾아봤는데요...
심지어 지금 나의 개발환경에서 깔 수 있는 파이썬 패키지 배포 버전을 아래와 같이 확인할 수도 있습니다.
import packaging.tags
tags = packaging.tags.sys_tags()
print('\n'.join([f'{tag.interpreter}-{tag.abi}-{tag.platform}' for tag in tags]))
여기서 확인할 수 있는 태그임에도 깔 수가 없는 겁니다!!!
컴퓨터에서 문자는 수, 좀 더 정확히는 이진수로 저장이 됩니다. 초기 컴퓨터는 0~127까지 7비트를 활용해서 알파벳과 일부 제어문자들을 다루었습니다. 이게 저희가 아는 ASCII 문자입니다. 하지만 세상엔 다른 제어 문자들도 많고, 무엇보다 각 국가마다 문자들이 아예 다르기 때문에 7비트 이후의, 즉 128 이후의 문자들이 제각기 달랐으며 호환성 문제가 발생할 수 밖에 없었습니다.
이를 위해 전세계적으로 모든 문자를 31비트, 즉 4비트 안으로 인코딩하는 표준을 만들었고, 그게 바로 저희가 아는 Unicode 입니다. 그렇게 UCS-4(Unicode Character Set) 이 나오게 되었습니다. 하지만 문자 하나에 4바이트를 쓰는 건 메모리 낭비를 초래했고 보통 사용하는 대부분의 문자를 포과할 수 있는 하위 16비트를 사용하는 UCS-2 가 나오게 되었던 겁니다.
여기서 더 효율적으로 하기 위해 가변 길이를 사용하는 UTF 가 등장하게 된 것이구요. 우리가 잘 쓰는 UTF-8은 1바이트 ~ 6바이트(호환성 위해 보통 4바이트까지) 필요한 만큼 가변 길이를 채택합니다. UTF-16은 2바이트 ~ 4바이트, 그리고 UTF-32는 UCS-4 와 같습니다.
아래와 같이 파이썬 코드를 실행해 보시겠어요?
import sys
print(sys.maxunicode)
만약 결과로 1114111 이 아닌 65535 이 나온다면, 그것이 문제입니다.
어찌 됐었든 UCS-2는 2 바이트 이기에 0XFFFF = 65536 까지를 표현하기에 결과가 위와 같이 나온 것이구요. 1114111은 UCS-4가 0X10FFFF = 1114111 까지를 표현하기에 나온 결과입니다. 물론 이가 유니코드 전체의 표현범위이구요.
기본적으로 우리가 파이썬을 깔면 UCS-4 상태로 설치가 됩니다. 하지만, 파일을 받아 직접 컴파일해서 깔 때에는 configure
가 기본적으로 UCS-2 로 설정되어 있습니다. 그래서 UCS-4를 지원하는 라이브러리가 깔리지 않았던 것입니다!!! 🧐 따라서, 아래와 같이 옵션을 꼭 넣어 설치를 해주어야 합니다.
$ ./configure --enable-unicode=ucs4
$ make altinstall