Argparse - Uvicorn / Gunicorn 충돌 해결

johyonghoon·2023년 3월 22일
0
post-thumbnail

에러

uvicorn: error: unrecognized arguments: main:app --reload
ERROR:    Exception in ASGI application
Traceback (most recent call last):
…
File "/Users/johbrain/PycharmProjects/Fastapi_howsfit/./main.py", line 147, in viton_image
get_viton()
File "/Users/johbrain/PycharmProjects/Fastapi_howsfit/./viton/my_test_generator.py", line 216, in get_viton
opt = get_opt()
File "/Users/johbrain/PycharmProjects/Fastapi_howsfit/./viton/my_test_generator.py", line 73, in get_opt
opt = parser.parse_args()

해결방안

  1. uvicorn 또는 gunicorn을 실행하기 전에 로컬에서 main으로 실행하여 정상적으로 동작하는지 확인
  2. argparse를 사용하여 옵션 지정을 해주는 함수를 호출하여 출력값을 확인

def get_viton():
	opt = get_opt()
    print(f">>>>> get_opt output : {opt}")
    print("-" * 200)
    
if __name__ = "__main__":
	get_viton()
3. Namespace( ~~ ) 해당하는 부분을 복사하여 opt = argparse.Namespace( ~~ ) 로 처리해주고 argparse 임포트

❕주의사항

이건 말 그대로 출력값을 그대로 가져다 사용하는 것이다. 정상적인 방법은 아닐듯...
따라서 인자 또는 옵션 값을 수정하려면 당연히 get_opt() 함수를 수정하면 안되고,
Namespace 파라미터 값을 수정해야 한다.(이왕이면 둘 다 수정해놓는게 실수하지 않는 방법이다.)
필자는 까먹고 함수 값을 수정했다가 금방 알아채고 고쳤다.

문제점

한참(반나절)을 못잡고 있다가 많은 개발자가 쉽게 실수하는 부분이라고 하여 기록해둔다.

이게 정설은 아닐 수 있지만 추정컨데
uvicorn 또는 gunicorn에서 argparse에서 설정하는 인자 또는 옵션들을 사용함에 있어서 에러가 발생한다.
위에서도 get_opt()라는 함수를 사용할 때 unicorn에서 unrecognized arguments라고 에러가 발생한다.
아니 그냥 함수화 시켜놓고, (나같은 경우) viton에 사용하려고 호출하는건데 그걸 끌어다가 uvicorn이 쓰나?
라고 생각할 수 있는데 그걸 끌어다가 쓰고 있더라...

HR-VITON에서 이미지를 생성할때 argeparse를 사용하여 인자들을 지정해준다.


이미지에서 보이는 인자 외에도 꽤 많은 부분들을 지정하여 사용하고 있다.

서비스를 위해 아래 코드로 서버를 실행시켜 주었고, flutter로 post를 보내 코드를 실행하려 했다.
하지만 아래의 에러가 나타나면서 실행되지 않고 종료되었다.
로컬에서 test_generator.py가 정상적으로 실행되는 것을 확인했기 때문에 코드에는 문제없다고 생각했고,
찾아보다보니 uvicorn 또는 gunicorn에서 argeparse와 충돌하는 것을 알게 되었다.

잘 안보이겠지만 설명을 하자면 uvicorn에서 argeparse로 지정한 옵션들을 사용하려 하고 있다.
당연히 uvicorn이 가지고 있는 옵션이 아니기 때문에 에러가 발생하는 것(추정)

해결 방안을 고민 중이지만 어떻게 해야할 지 모르겠다.
엊그제부터 어제 밤까지 openpose를 ubuntu20.04에서 빌드하게끔 시도했는데
cpu 없이 빌드하는 것이 ubuntu20.04에서 불가능하다는 것을 어제 밤에 알게되었다.
14버전 또는 16버전에서만 가능하다고 한다.
상식적으로 openpose를 gpu없이 사용한다는게 말이 안되긴하지
근데 난 gpu 서버를 운영할 돈이 없는걸...

아무튼 이 글을 읽으시는 분들은 충돌을 금방 인지하고 위 방법을 사용하거나 argparse를 사용하지 않기를...


참고자료

neos960518.log : gunicorn과 nginx를 사용해서 Flask 앱 배포하기

0개의 댓글