본문 바로가기

오류해결

Window10에서 mlfow 설치 및 UI실행 오류 해결

MLflow  실습을 하던 중, 가장 처음 단계인 설치를 하자마자 오류가 발견되었다. 

원래 CS는 환경설정하는 것이 가장 어려운 법..

 

여러 블로그와 mlflow 사이트를 참고해서 해결한 방법을 공유합니다. 

 

# 시도, 실패, 해결 과정

1. mlflow 설치 후,  오류 발견

2. MLflow에서 사용되는 flask와 jinja2의 버전 충돌

3. 강제 reinstall 

4. SSL 문제 발생

5. Window에서 OpenSSL 다운로드

6. flask, jinja2, mlflow 재설치

7. 성공ㅠㅠ 

8. MLflow UI 진입 성공

 

시작합니다!! 

 

pip install mlflow

 

위의 코도는 mlfow를 CLI에서 설치하는 코드입니다. 

 

[에러]
Traceback (most recent call last):
  File "C:\Users\jihoo\Anaconda3\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\jihoo\Anaconda3\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\jihoo\Anaconda3\Scripts\mlflow.exe\__main__.py", line 7, in <module>
  File "C:\Users\jihoo\Anaconda3\lib\site-packages\click\core.py", line 1128, in __call__
    return self.main(*args, **kwargs)
  File "C:\Users\jihoo\Anaconda3\lib\site-packages\click\core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "C:\Users\jihoo\Anaconda3\lib\site-packages\click\core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\jihoo\Anaconda3\lib\site-packages\click\core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\jihoo\Anaconda3\lib\site-packages\click\core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\jihoo\Anaconda3\lib\site-packages\mlflow\cli.py", line 400, in server
    from mlflow.server import _run_server
  File "C:\Users\jihoo\Anaconda3\lib\site-packages\mlflow\server\__init__.py", line 9, in <module>
    from flask import Flask, Response, send_from_directory
  File "C:\Users\jihoo\Anaconda3\lib\site-packages\flask\__init__.py", line 14, in <module>
    from jinja2 import escape
ImportError: cannot import name 'escape' from 'jinja2' (C:\Users\jihoo\Anaconda3\lib\site-packages\jinja2\__init__.py)

 

 다음의 에러를 얻을 수 있습니다. 

가장 중요한 건 맨 맽의 Import Error 부분인데, 해당 문제의 원인은 MLflow에서 사용되는 Flask와 Jinja2의 버전 충돌입니다. 

 

따라서, 설치되어있는 flask와 Jinja2의 버전을 확인해봅시다. 

pip show flask

pip show jinja2

 

설명되는 마지막 부분에서 서로의 버전이 충돌한다고 되어있습니다. 

 

새로운 문제가 발생했네요... 젠장..

 

두 라이브러리의 호환문제를 해결하기 위해서, 강제로 reinstall을 합니다. 

pip install --force-reinstall flak jinja2 mlflow
## 강제로 flask janja2 flask 다시 설치

 

또 오류가 발생합니다. 

 

[에러 발생]
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
Could not fetch URL https://pypi.org/simple/flask/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/flask/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
ERROR: Could not find a version that satisfies the requirement flask (from versions: none)
ERROR: No matching distribution found for flask

 

젠장... 

 이번엔 ssl 문제네요.. 

window에서 python이 SSL모듈을 사용할 수 없어서 발생합니다. 대부분, Python이 SSL을 사용할 수 없는 이유는 OpenSSL이 설치되지 않았거나, SSL지원이 비활성화 되었기 때문입니다. 

 

CLI의 python에서 openssl이 설치되어있는지 import를 해봅시다.

python
>> import openssl

# Trace back 에러

 

위의 코드처럼 trace back에러가 나면, openssl을 설치해야합니다. 

 

Window에서의 openssl은 Ubuntu나 Mac보다 약간..? 복잡합니다. 

저는 다음의 블로그를 참고했습니다. 

(참고 : https://warmdeveloper.tistory.com/64)

설명이 잘 되어있더군요.. 감사합니다. 

 

openssl 설치 

- OpenSSL 다운로드하기 : https://warmdeveloper.tistory.com/64 
최신버전 exe를 눌러서 다운로드 받으면 된다. 

- 환경변수 설정
설치 파일을 다운로드 받았던, 경로를 잘 확인해야함.

- 시스템 변수 -> 환경변수 -> 시스텝변수의 path에 가서 C:\Program Files\OpenSSL-Win64\bin 추가하기 

- 그리고 OPENSSL_CONF변수를 새롭게 생성
이름 : OPENSSL_CONF
경로 : C:\Program Files\OpenSSL-Win64\bin\openssl.cfg

 

이제 openssl문제 해결이 되었습니다. 

 

다시 mlflow를 설치하고, UI를 실행시켜 봅시다. 

 

## flask, jinja2, mlflow 강제 재설치
pip install --force-reinstall flask jinja2 mlflow

## MLflow UI 실행
mlflow ui
# 포트값을 지정하지 않으면, default port는 Serving on http://127.0.0.1:5000, 즉 5000입니다.

 

드디어 해결했네요..

 

여러분들도 단번에 해결하길 바랍니다.