TensorFlow에서 CUBLAS_STATUS_NOT_INITIALIZED 오류 문제

failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED

이 문제는 TensorFlow의 GPU memory growth 설정과 관련이 있다. 이 경우 GPU의 allow_grouth option을 True로 설정하면 문제를 해결할 수 있는데, Use a GPU 페이지에 따르면 tf.config.experimental.set_memory_growth()를 통해 True로 설정하거나 혹은 환경변수 TF_FORCE_GPU_ALLOW_GROWTH를 설정해서 해결 할 수 있다.

코드에 다음과 같이 환경 변수를 설정해 줄 수도 있지만,

실행 환경에 따라 문제가 발생하지 않을 수도 있어서, 나는 주로 command line에서 다음과 같이 script를 실행할 때 이 값을 함께 설정한다.

Transpose convolution의 출력 크기

Keras의 transpose convolution 2D (Conv2DTranspose) 레이어로 DCGAN을 실습해보고 있었는데 gemrator가 생성해야 하는 image가 나누다 보면 소수(prime number)가 나오는 직사각형 크기의 178×218 였다.

많은 예제 코드들에서 transpose convolution 2D의 padding을 “same”으로 지정하기 때문에 Conv2DTranspose의 출력 크기는 stride의 배수여야 한다고 오해 했었는데, 실은 padding을 “same”으로 설정하느냐 혹은 “valid”로 설정하느냐에 따라 출력의 크기가 다음과 같이 달라진다.

# padding을 ‘same’으로 설정 했을 때
Output = Input \times stride

# padding을 ‘valid’로 설정 했을 때
Output = (Input - 1) \times stride+ filter

예를 들어 다음 layer를 선언하고 (44, 54, 3) tensor를 주면 소수 값의 (89, 109, 64) tensor가 출력된다.

한글 텍스트 추출을 위한 Python PDF module

이 내용은 2020년 3월에 작성된 것으로 참조하는 시점에 따라 변경된 사항들이 있을 수도 있습니다.

PyPDF2

PyPDF2는 PDF file의 metadata 정보를 가져오거나 페이지 단위로 나누거나 합치는 등의 여러가지 편리한 기능들을 제공한다. 하지만 한글을 제대로 추출하지 못하는 문제가 있어서(한글 뿐 아니라 CJK 모두 라고 함) 목적에는 적합하지 않았다.

PDFMiner

한글 처리는 문제 없다. 그런데 페이지 단위로 나누어서 처리하는 것을 따로 지원하지 않아서 원하는 페이지에 접근하려면 순차적으로 처음부터 해당 페이지를 찾아가는 trick을 사용해야 하는데, 이 코드로 순차적 접근을 하면 시간 복잡도가 O(N^2)가 되어 파일의 크기가 조금만 커도 성능이 매우 떨어진다.

Tika

많은 곳에서 쓰이는 꽤나 유명한 프로젝트인데 Python module로도 proting 되어 있다(tika-python). 한글 추출에는 문제가 없고, 이 모듈 자체에서는 페이지 단위의 텍스트 추출을 지원하지 않으나, 그대신 PDF를 XML로 추출한 다음에 BeautifulSoupe로 <div page=””> 태그를 찾아 페이지 단위로 접근하는 신박한 트릭이 있다(StackOverflow). 나는 BeautifulSoup의 paser로 lxml을 사용했다.

주의. 명시적으로 표시 되지는 않지만 JRE(Java Runtime Environment)에 의존하므로 동작시 오류가 발생하면 JRE가 제대로 설치 되어 있고 접근 가능한지 확인해 볼 것. Ubuntu 18.04 default-jre package (OpenJDK 11)로 동작 확인.

결론

PDF 문서 자체에 대한 합치기/나누기/정보 가져오기 등은 PyPDF2가 무척 편하다. 한글 텍스트 추출을 위해서는 Tika, 페이지 단위 접근이 필요하다면 Tika + BS를 고려해 볼 만하다. PDFMiner는 뭐랄까.. 쫌 별로..

[Tip] Emac에서 pdb 사용할 때 UnicodeEncodeError

*** UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 168-169: ordinal not in range(128)

Emacs에서 shell을 열고 pdb를 실행 할 때 표시하고자 하는 문자열이 ASCII가 아니라면 발생 할 수 있는 문제인데 emacs의 초기화 파일에 unicode locale 설정을 해주는 것으로 해결할 수 있다. 인터넷 문서들 중에는 LANG, LC_LANG, LC_CTYPE 모두를 설정해 주어야 한다는 내용도 있었으나, 내 terminal에서 LC_CTYPE만 설정해서도 잘 동작되고 있으므로 이를 따라 LC_CTYPE만 UTF-8으로 다음과 같이 설정해 주었다.

Init file을 reload하거나 emac를 재 실행해서 ASCII외의 문자들이 잘 표시 되는지 확인해 본다.

그리고 GitHub repository에 업뎃. 🙂

[Tip] Mac OSX에서 시작 프로그램 삭제

Mac OSX에서 로그인시 자동으로 시작되는 프로그램을 삭제 하는 방법들은 대략 다음과 같다.

  1. 태스크 바에서 오른 클릭 후 ‘로그인 시 열기’ 해제
  2. 설정 -> 사용자 및 그룹 -> 로그인 항목에서 삭제
  3. /Users/<사용자계정>/Library/LaunchAgents/에서 unload
  4. /Library/LaunchAgents/에서 unload

사용자 계정에 등록된 로그인 항목 unload (위의 3번)

위의 1번과 2번 방법은 인터넷에 많이 있으니, 테스크바에도 등록되어 있지 않고 설정의 로그인 항목에서도 프로그램이 보이지 않는 경우, 사용자 디렉토리 내의 LaunchAgents에서 찾아 삭제를 시도해 볼 수 있다. 다음은 CrashPlan이라는 프로그램을 사용자 계정 시작 항목에서 삭제 하는 예시이다.

시스템 전체로 등록된 로그인 항목 unload (위의 4번)

프로그램에 따라 사용자 계정별이 아닌 시스템 전체의 시작 프로그램으로 등록된 경우도 있다. 이 경우 /Library/LaunchAgents/에서 찾아 삭제를 시도할 수 있다. 다음은 Cisco AnyConnect VPN 프로그램을 시작 항목에서 삭제하는 예시이다.