rlcode / reinforcement-learning-kr-v2

[파이썬과 케라스로 배우는 강화학습] 텐서플로우 2.0 개정판 예제
MIT License
128 stars 100 forks source link

다들 Atari 잘되시나요?? #19

Open rubyjohn opened 3 years ago

rubyjohn commented 3 years ago

저만 이상한건지 모르겠는데 Atari가 제대로 안되는군요. 한군데가 아니고 여러군데, 윈8.1 윈10 등에서 다 그러는데...

딱히 질문은 아니고 제가 해결한 방법을 올립니다. 아마 vs 2015 이상 깔린데는 괜찮으리라 보긴 합니다만, 안깔린 곳에서 돌리실 분들 참고바랍니다.

  1. 사용한 베이스 환경 : Anaconda3-2019.10-Windows-x86_64.exe (그냥 쓰던거라 계속 씀) tf 1.15.0 + keras 2.2.4 (1판 내용 돌릴때 씀) tf 2.3.0 (2판 내용 돌릴때 씀) 위 둘은 각각의 가상환경으로 돌림.

  2. 필요한 패키지 pip install scikit-image pip install gym pip install gym[atari] (당연한거지만 다 설치한 다음, 다음 내역 진행해야함. 아니면 폴더도 없으니까요...)

    아래는 설치된 gym atari 버전입니다. gym 0.18.0 atari-py 0.2.6

  3. 지금 설명할 부분은 tf 1.x 에서는 이상없는 부분인데, 이상하게 tf 2.x에서는 안됨. FileNotFoundError: Could not find module 'C:\ProgramData\Anaconda3\envs\tensorflow2\lib\site-packages\atari_py\ale_interface\ale_c.dll' (or one of its dependencies). Try using the full path with constructor syntax. 위와 같은 에러가 뜸. https://stackoverflow.com/questions/63080326/could-not-find-module-atari-py-ale-interface-ale-c-dll-or-one-of-its-dependenc 위 링크를 참고하여 ale_c.dll 을 다운받거나, 혹은 1.15 환경에서 설치한 후 ale_c.dll 파일을 꺼내와서 C:\ProgramData\Anaconda3\envs\ <가상환경이름> \Lib\site-packages\atari_py\ale_interface 이 경로에 복사해 넣으세요. (물론 있으면 안넣어도 되지만 아마 없을겁니다.) (참고로 저기서 다운 받으나 1.15에서 정상적으로 설치된 것을 꺼내오나 2020-12-30 기준 ale_c.dll 파일의 해시는 동일합니다)

  4. 이게 또 고약한 부분인데 일단 vs2015 이상 깔렸다면 괜찮을 가능성이 있는데 vs깔린곳에서 안해봐서 확실히는 모르겠음. msvcp140d.dll 가 문제가 있다고 에러가 뜨는데, 이건 vs 같은게 깔려야만 생기는 파일입니다. (재배포패키지 vs2015-2019 등의 설치로는 해결 안될수 있음.) (~~d.dll은 대개 디버그용 dll이라 vs 안깔면 대개 안깔림)

    https://zweistar2.tistory.com/253 위 링크에서 32bit-dll 을 받은후 C:\Windows\System32 에 풀어넣으면 됩니다.

    32bit-dll 파일 내용이 C:\Windows\System32 에 똑같이 있는지 확인후 System32에 동일 파일이 있다면 원본은 백업하고 복사해 넣으시기 바랍니다. 무조건 덮어씌웠다가는 다른 64비트 응용프로그램이 실행 안될 수 있습니다. 왜냐하면 아타리를 위해서라면 덮어씌우면 되긴 되는데, 아타리 하나 돌리려고 다른거 실행 못하는 대참사가 벌어질 수 있습니다. 반드시 원본 백업 하세요. 자신없으면 가상머신에 테스트로 해보시거나요.

    여기까지만 보면 왜 고약한 문제인지 이해가 안갈수 있는데요,

    C:\Windows\System32 <- 64비트 dll 자리 C:\Windows\SysWOW64 <- 32비트 dll 자리 (오타 아닙니다. 이름만 봤을때는 정반대 같지만, 실제로 저게 본래 각 비트에 따른 dll 자리입니다.)

    즉, 64비트 dll 장소에 32비트 dll을 넣어야하기 때문에 문제가 될 수 있습니다. (처음에 실험한다고 여기저기 막 넣어보다 발견) 위에 말했듯, 기존파일이 있을경우 덮어씌우다가 다른게 망가지는 참사가 발생할 수 있으니, 32bit-dll 파일 내용이 C:\Windows\System32 에 똑같이 있는지 확인후 System32에 동일 파일이 있다면 원본은 백업하고 복사해 넣으시기 바랍니다.

가상머신 등 여러군데서 신규설치하며 확인해본 결과 여기까지 하면 breakout_a3c 등 Atari 돌리는건 할 수 있습니다. 만약 위 사항을 따르지 않고도 그냥 잘되거든 위에 내용은 무시하시면 됩니다. 괜히 손댔다 더 꼬일 수 있음.