@dsl.pipeline 이슈 해결

노하람·2022년 2월 4일
0

Run creation failed

Incorrect string value: '\xEC\x9D\xB4 \xED\x95...' for column 'WorkflowRuntimeManifest' at row 1"

해결 과정

  1. 이슈 내용을 검색해보니, 대부분 MySQL 쿼리에서 한글이나 특수문자가 들어갔을 때 utf8을 정상적으로 인식하지 못해서 발생하는 문제인 것 같다.
    • MySQL은 sudo vi /usr/local/mysql/my.cnf 파일을 수정해주면 되지만, dsl pipeline에서 해당 문제가 발생한건 어떻게 해결해야할까? 대충 찾아보니 일단 같은 문제로 이슈를 올려둔 사람은 없다.
    • Kubeflow 실행 시 MySQL이 함께 동작하기는 하는데 해당 문제일까? 하지만 수정할 방법이 떠오르지 않는다.
  2. 해당 에러는 ContainerOp 함수부터 @dsl.pipeline까지 모두 한번에 적어놓은 .py파일을 Ops.py 파일과 pipeline.py 파일로 나누면서 발생했다.
    • 변경한건 Ops.py에 정의된 함수를 pipeline.py에서 사용하기 위해서 from tfjob_ops import *을 했다는 것 -> 검증 결과 상관없다.
    • 파이프라인 정의함수의 매개변수를 전역변수를 받아오지 않고, 매개변수에 바로 str으로 정의해주었다는 것 -> 검증 결과 상관없다.
    • docstring을 추가했다는 것(영어로) -> 검증 결과 상관없다.
  3. 파일을 나눴을 뿐 크게 문제가 될 수정사항이 있었던 것이 아닌데, 이상하다.
    • experiment, suggestion, tfjob 모두 존재하지 않는 것을 확인했다. volumns와 model도 마찬가지다. 먼저 생성되어있던 것이 있어 재생성이 불가능한 문제는 아니다.
    • Lens로 리소스들을 다시한번 훑어보자. -> persistant volumns가 확인 결과 남아있었다. 분명 kubeflow UI에서 삭제했는데 말이다. 앞으로는 볼륨삭제시 리소를 검토할 필요가 있겠다. 아쉽게도 이건 해결방법이 아니었다.
    • 클러스터 재시작 -> 검증 결과 상관없다.
    • 코드에 달아놓은 한글 주석을 모두 영문자로 변경 -> 해결!!!

해결 방법

코드의 모든 한글 주석 및 DocString을 영문으로 변경하니 오류가 사라졌습니다.
다만 코드를 두 파일로 나누기 전엔 정상적으로 한글이 있어도 동작했는데, 갑자기 이러시는 이유가 뭘까요?

profile
MLOps, MLE 직무로 일하고 있습니다😍

2개의 댓글

comment-user-thumbnail
2022년 2월 15일

저도 같은에러가 있어서 찾게됐습니다.
한글 쓴게 없는데 왜 에러가 나나 했더니 출력하는 string에 포함된 한글이더군요 저는

답글 달기
comment-user-thumbnail
2022년 11월 24일

댓글 알림 기능이 없어서 이제 봤네요.
1. 컨테이너를 이용한 코드를 워크플로로 컴파일 할 때는 문제가 없습니다.(단순히 컨테이너를 실행시키는 것만 yaml 형식으로 변환되기 때문입니다.)
2. 다만 함수를 containerOp로 변환하는 func_to_container_op을 사용할 때는 변환받는 함수에 한글이 포함되면 안됩니다. workflow로 컴파일해서 run 시킬 때 컴파일 된 yaml 파일을 살펴보면 아래처럼 디코딩이 잘못 된 문자들이 포함되게 됩니다.

dfh_me[\"SETMODE_INT\"] = dfh_me[\"SETMODE\"].replace(\n    #     [\"\uc1a1\ud48d\uc6b4\uc804\",
          \"\uac00\uc628\uc6b4\uc804\", \"\uc1a1\ud48d+\uc81c\uc2b5\", \"\ub0c9\uac01\uc6b4\uc804\",
          \"\ub0c9\uac01+\uc81c\uc2b5\"], [1, 2, 3, 4, 5]\n    # )\n    dfh_me[\"SETMODE_INT\"].loc[dfh_me[\"RUNSTOP\"]

따라서 해당 방법으로 containerOp를 생성하고자 할 때는 한글이 포함된 로직을, 변환하는 함수 외부의 별도 함수로 만들어서 처리하고 반환되는 값만 받아오면 됩니다. 그럼 함수를 호출하는 구문만 컴파일되기 때문에 한글이 들어가지 않아 정상적으로 실행됩니다.

예를 들어 저는 dfh_me["SETMODE_INT"] = dfh_me["SETMODE"].replace(["송풍운전", "가온운전", "송풍+제습", "냉각운전", "냉각+제습"], [1, 2, 3, 4, 5]) 이 구문이 문제가 되었는데, 이미 데이터를 한글이 포함되도록 받아오기 때문에 데이터 수집 과정부터 수정하는건 일이 복잡해졌습니다.
그래서 처리구문을 별도의 함수로 작성하고 반환값만 받아오시는 식으로 해결하였습니다.

주석도 마찬가지로 func_to_container_op등에 쓰일 함수 내부에는 한글이 포함되지 않도록 해주시면 되겠습니다.

답글 달기