(깔아만 놨던..) 텐서플로우 2 알파에 이어 며칠 전에 베타가 나왔다길래 드디어 한 번 써 봅니다.

뭐 의미있는 건 아니지만... 제 맘대로 썼으니 틀린 것 많을 겁니다. 어차피 보실 분 없으니 틀리면 추후 고치는 걸로.

눈에 띄는 달라진 점

(공식 문서 경로가 영구링크가 아니네...)

"이펙티브 텐서플로 2.0" --- (어디서 많이 본 제목...)
1.0에서 2.0으로 이사하기
2.0으로 변환 스크립트

아래는 "이펙티브 텐서플로 2.0" 문서에 있는 것 중 눈에 띄는 것 적어본 것입니다.

  • 그래프 차리고 이것저것 차린 다음에 세션 열고 돌리는 방식에서

    • 적절히 만든 (=데코레이터 씌운) 파이썬 함수를 호출하면 알아서 지지고 볶아준다고 합니다.
      • 각 모델 구현을 파이썬 함수로 감싸고 텐서플로 함수라고 데코레이터 씌운 뒤 (`@tf.function`) 그냥 호출하면 알아서 돌려준답니다.
      • Eager(?) 기능이 메인이 되었네요.
      • 모든 함수를 텐서플로 함수로 감쌀 필요는 없고, 최상위 작업만 (inference, train 같은 거) 감싸주면 된다고 봤습니다.
    • v1 스타일대로 세션 열고 돌리려면 tf.compat.v1 네임스페이스로 이사간 'Session' 함수를 쓰라네요.
  • 전역 네임스페이스가 없어졌대요. 이제 정의한 변수를 잘 갖고 있어야 된답니다.

    • tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES) 같은 거 이제 안 되나봅니다. 어쩌지...
    • 대신 Keras에 model, layer 단위에서 정의했던 변수를 모아두는 기능이 있다네요. variables, trainable_variables 속성이 있대요.
  • 로그 수집 방법이 살짝 좋아진 것 같네요. tf.metrics를 쓰면 평균 같은 것 쉽게 수집할 수 있는 듯 합니다.

    • 예전에 저는 잘 몰라서 직접 파이썬 변수에 loss 값 같은 거 모은 뒤, batch 개수로 나눠서 평균 표시했었는데...
  • v2 기능이 정 싫다면 v1 모드로 돌릴수도 있지만, v2로 코드 변환 스크립트 및 v1 호환성 모듈을 준비했으니 어서어서 갈아타주시라네요. 과연 몇 년 걸릴지...

설치

기존 v1 설치된 환경에서 (Ubuntu 18.04, Nvidia 10x0 시리즈 GPU, 드라이버 410, CUDA 10, libcudnn v7) 그냥 아나콘다 새 환경 파고 pip 패키지 설치로 깔았습니다.

$ conda create -n tf_2 python=3.6
$ conda activate tf_2
$ conda install <필요 패키지>

$ pip install tensorflow-gpu==2.0.0-beta

그러나 돌려보니 libcudnn 오류 ㄷㄷㄷ

다른 블로그 글 찾아보고 GPU 드라이버 버전을 430으로 올려도 봤지만, 그냥 libcudnn 최신 버전으로 업그레이드하니 잘 동작하게 되었습니다.

일부 환경에서 per_process_gpu_memory_fraction 또는 allow_growth를 켜 줘야 GPU 연산이 정상 동작한다는 이야기가 있네요.

Session이 없어졌으니... GPU 설정은 어디서 하지?

  • GPU 2개 이상인 경우 원하는 GPU만 쓰도록 설정하거나
  • TF가 GPU 메모리를 모두 할당하지 않게 하기 위해
    • 여러 사용자가, 또는 여러 프로세스가 GPU 함께 쓰는 경우를 고려해야겠죠

v1에서는 tf.Session(config=<blahblah>)했었죠. v2에는 tf.Session이 없네요..

대신, 깃헙 이슈를 보니 tf.config.experimental에 있는 함수를 쓰라는군요.

참고: tf.config 코드

아래 예시는 모든 GPU에 대해 allow_mem_growth 설정을 먹인 뒤, 두 번째 GPU(와 CPU)만 쓰도록 하는 코드 조각입니다:

# set GPU devices not to allocate all memories
gpu_devs = tf.config.experimental.list_physical_devices('GPU')
[tf.config.experimental.set_memory_growth(i, enable=True) for i in gpu_devs]

# find CPU device
cpu_devs = tf.config.experimental.list_physical_devices('CPU')

# explicitly set devices to be used
tf.config.experimental.set_visible_devices([*cpu_devs, gpu_devs[1]])

가상 디바이스를 만들 수도 있나 보던데, 아직 _메모리 상한선을 명시_해야 작동해서 안 쓰기로 했습니다.

좋은 친구 MNIST, LeNet 돌려보기

2.0 시작하기

위 문서를 보면 MNIST 돌려보는 예시가 있습니다. 내 주피터 노트북에 위 문서의 코드 복붙하고 돌려보면 당연히 잘 돌아갑니다.

코드를 둘러보면,

  • 데이터 준비가 간편해보이네요
  • 모델 클래스... Keras 쓰기 싫으면 어떻게 할 지 모르겠네요
  • loss function, optimizer도 keras 걸 갖다 쓰네요.
  • tf.GradientTape이라는 게 새로 생긴 것 같습니다
  • placeholder 그만 쓰는 것 아주 좋은데, dimension 점검이 쉽지 않을 것 같아요

소감

  • 이제 세션 같은 거 만들 필요 없이, 함수 호출만 하면 알아서 돌아가니 좋긴 하네요
    • 코드를 보다 깔끔하게, 파이썬스럽게 쓸 수 있겠습니다
    • 저수준 제어가 어려워졌을까요. 그건 차차 알아보기로
  • 데이터 로더 좋아졌다고는 하는데... v1 때 개선되었다던 데이터 로더 전혀 이해 못했는데... v2 것도 제가 쓸 정도로 쉬울 것 같지는 않습니다
  • 기존의 컴파일(?)되면 고정되는 그래프에서, 파이토치 것 같은 다이나믹 그래프로 갈아탄 것 같은데요, 실험하기 좋을 것 같습니다
    • 진짜 그런지는... 그것도 차차 알아보기로
  • Keras 안 쓰는 경우의 예시를 한 번 찾아봐야겠습니다

굳이 지금 갈아타야할까 하면... v1으로 하던 실험이나 잘 하는 걸로 합시다 😢😢

TL; DR

일단 솔직히 원인을 잘 모릅니다. 다른 블로그 찾아보세요 :( ....

요기가 좋아 보이네요: https://www.tabida.pe.kr/58   
특히 검색 인덱싱 속도를 높이기 위해 "그룹 정책"에 들어가서 "PC를 사용 중이더라도 최고 속도 인덱싱" 옵션을 켜는 것이 인상적입니다. 저는 아직 못 써봤지만...

저의 경우는 PC 포맷 후 수많은 메일이 들어있는 메일 계정 로그인을 해 뒀을 때, 인덱싱이 매우 오래 걸릴 (이건 메일이 많으면 어쩔 수 없다네요.) 뿐더러 인덱싱 중인데 메일 검색을 시도했을 때 검색 결과로 최근 메일 일부만 뜨는 문제였습니다.

<Outlook 옵션 - 검색>에서 "가능한 경우 쿼리 입력시 결과 표시" 옵션꺼서, 인덱싱 결과를 쓰지 않고 검색하도록 하여(?) 문제를 우회했습니다.

아직 인덱싱 진행 중이라는 오류 메시지가 안 떴는데, 앞선 글처럼 비정상적인(?) 방법으로 계정 추가를 해서 그럴지 모르겠네요.

 

겪은 문제 증상

"인덱싱이 안 되었다"고 오류 메시지가 뜨지는 않으나, 결과 몇 개만 나오고 전체 결과는 안 나오는 상태였습니다. 인덱싱이 잘 안 되고 있는 상태였는데요.

  • 인덱싱 상태를 보면 수만 건 메일 항목이 인덱싱을 기다리고 있다고 나타났습니다. 어림짐작이지만 10초당 100건씩 줄어드는 것 같았어요.
* 인덱싱 상태 보기

아웃룩 프로그램에서 검색란을 클릭하면, 위의 리본 메뉴에 [검색] 탭이 생깁니다.
클릭한 뒤 [검색 도구] > [인덱싱 상태]를 차례로 누르면 현재 인덱싱 프로그램이 뭘 하고 있는지 나옵니다.

알아서 새로고침되지 않으니, 인덱싱이 되어서 갯수가 줄긴 하는지 보려면 조금 있다가 직접 인덱싱 상태 창을 다시 열어주어어 합니다...

[인덱싱 상태] 메뉴 위치
지금은 인덱싱이 끝났지만...

해결 아니고 우회 방법

파일 - 옵션 - 검색으로 들어가서 "가능한 경우 쿼리 입력시 결과 표시" 옵션껐습니다. 인덱싱 결과를 쓰지 않고 검색하도록 하는 것 같은데요, 요렇게 하니까 검색이 되기는 되더라구요.

다만 인덱싱 결과를 안 쓰니 검색 속도가 느려진다고는 하는데... 일단 검색 되는게 우선이죠.

 

실패한 도전

  • 메일함 파일 깨져서 색인이 안 되나 해서 MS오피스 프로그램 폴더에 있는 "ScanPST.exe" 프로그램을 돌려봤습니다. 항목 몇 개가 손상되었고 고쳤다고 했지만, 인덱싱 속도 개선에는 별 소용이 없더군요. 아니... 방금 로그인했는데 손상된 항목이 있다고요???
  • 아웃룩 검색 옵션에서 "표시되는 결과 수를 제한하여 검색 속도 높이기" 옵션을 먼저 꺼 봤지만 소용이 없었습니다.

 

가지 않은 길

  • 정 인덱싱이 안 되면 "인덱스 재생성", 또는 아예 윈도 인덱싱 서비스를 포기하라고도 하더군요. 아무리 그래도 그건...
  • 방금 찾아보니 PC 사용 중일 때 인덱싱 속도를 늦추지 않도록 하는 옵션이 있다고 하네요..

 

IMAP/SMTP 로그인할 때 메일 계정 전체 말고 메일 아이디만 써야 하는데,

2019 로그인 화면에서는 "로그인 아이디" 입력란이 없어졌어요 :(

Outlook 2019 로그인 화면 중 IMAP 상세 설정 화면... 로그인 계정 입력란 어디?

대신 이렇게 해 보세요.

# 아예 레지스트리 설정값을 고쳐서 예전 설정 창으로 되돌리는 방법이 있다고 합니다:

https://answers.microsoft.com/ko-kr/msoffice/forum/msoffice_outlook-mso_other-mso_2016/%ec%95%84%ec%9b%83%eb%a3%a9-2016/50a8a449-982b-42ad-814b-87b53d866bcb
https://support.microsoft.com/en-us/help/3189194/how-to-disable-simplified-account-creation-in-outlook

레지스트리 편집기에서 (시작 - 실행 - regedit),
* HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Setup\ 경로로 찾아 들어가서,
* (트리 오른쪽 빈 창에) 오른쪽 클릭 - [새로 만들기 - DWORD(32비트) 값] 클릭하고
* 항목 이름은 "DisableOffice365SimplifiedAccountCreation"으로, 1로 설정!

편집기를 끄고 Outlook을 다시 실행하면 예전 창으로 계정 생성이 가능하다고 하네요. 정말 됩니다.
  • 제어판 (윈도 10 설정 말고) > 사용자 계정 > Mail 로 들어가서

 

 

  • [전자 메일 계정] 버튼을 눌러 아웃룩 계정 설정 창을 띄우고

  • [전자 메일] 탭에서 [새로 만들기...] 버튼을 누르고 계정을 추가하세요.

예전 아웃룩 2016까지 쓰던 창이 나타나고요. IMAP 계정 상세 설정 창까지 가면 "로그인 계정" 입력란이 있습니다.

 

Outlook 2016까지 보던 상세 설정창이 반겨줍니다. 로그인 계정 입력란도 있네요!

 

 

아웃룩 프로그램 실행 중에, 위 방법으로 새 계정을 추가했는데 새 계정에서 메일 발송이 안 되면

아웃룩 프로그램을 껐다 켜 보세요.

아웃룩 프로그램이 떠 있는 상태에서 위 방법으로 새 계정을 추가했다면, 동기화할 폴더 목록에 새 계정의 폴더가 들어있지 않을 수 있습니다. 이 경우 [보내기/받기]를 백날 눌러봐야 소용이 없습니다.

 

+ Recent posts