Programming

[오픈소스 컨트리뷰션 아카데미] Backend.ai 개발환경 구축

VSFe 2021. 7. 26. 18:58

인터넷을 뒤져보다가 오픈소스 컨트리뷰션 아카데미라는 것을 찾아보게 되었다.

 

오픈소스에 관심이 있었지만, 기여할 기회는 거의 없었던 나로썬 매우 좋은 기회라고 생각했고, 관심있는 프로젝트를 찾아보았다.

 

여러 흥미로운 프로젝트가 있었지만, 그 중에서도 가장 관심있는 백엔드 파트가 있는 (다른 프로젝트도 있긴 하지만 사용해 본 적이 거의 없는 기술스택이었기에 넘겼다.) Backend.ai와 Yorki에 지원해보기로 하였다.

 

각 프로젝트에 지원하기 전 간단하게 개발환경 구축을 요구했기에, 각각에 대해 진행해본 후기를 남겨보려고 한다.

 

현재 내 컴퓨터의 경우, Windows 10 + WSL2 (Ubuntu 18.04)의 환경과 네이티브 리눅스 (Ubuntu 20.04)가 듀얼부팅 상태로 공존 (?) 하고 있다. 그런데 Backend.ai 설치 글을 찾아보니 WSL로 시도하다가 실패한 사례를 보았기에, 우선은 WSL2로 시도해보고, 잘 안되면 리눅스로 넘어가서 다시 시도해보기로 하였다.

 

일단은 깃허브에 방문해보자.

https://github.com/lablup/backend.ai

 

GitHub - lablup/backend.ai: Backend.AI is a streamlined, container-based computing cluster orchestrator that hosts diverse progr

Backend.AI is a streamlined, container-based computing cluster orchestrator that hosts diverse programming languages and popular computing/ML frameworks, with pluggable heterogeneous accelerator su...

github.com

 

설치 메뉴얼 페이지 (https://docs.backend.ai/en/latest/install/install-from-source.html) 를 보면, Clone 해서 scripts/install-dev.sh 를 사용하라고 언급 되어 있다.

 

우선은 개발 환경 구축 자체에 포커스를 맞추고 있으므로 모든 설정은 기본으로 진행하겠지만, 일단 -h 옵션으로 스크립트 옵션을 살펴보았다.

 

USAGE
  ./install-dev.sh [OPTIONS]

OPTIONS
  -h, --help           Show this help message and exit

  -e, --env ENVID
                       Manually override the environment ID to use
                       (default: random-generated)

  --python-version VERSION
                       Set the Python version to install via pyenv
                       (default: 3.9.5)

  --install-path PATH  Set the target directory
                       (default: ./backend.ai-dev)

  --server-branch NAME
                       The branch of git clones for server components
                       (default: main)

  --client-branch NAME
                       The branch of git clones for client components
                       (default: main)

  --enable-cuda        Install CUDA accelerator plugin and pull a
                       TenosrFlow CUDA kernel for testing/demo.
                       (default: false)

  --cuda-branch NAME   The branch of git clone for the CUDA accelerator 
                       plugin; only valid if --enable-cuda is specified.
                       (default: main)

  --postgres-port PORT The port to bind the PostgreSQL container service.
                       (default: 8100)

  --redis-port PORT    The port to bind the Redis container service.
                       (default: 8110)

  --etcd-port PORT     The port to bind the etcd container service.
                       (default: 8120)

  --manager-port PORT  The port to expose the manager API service.
                       (default: 8081)

  --agent-rpc-port PORT
                       The port for the manager-to-agent RPC calls.
                       (default: 6001)

  --agent-watcher-port PORT
                       The port for the agent's watcher service.
                       (default: 6009)

다음과 같이 다양한 옵션이 있었는데, 다행히 서비스 포트로 지정된 포트를 사용중이지 않기에 크게 문제는 없을 것 같았다. (TensorFlow가 오타가 있는데, 나중에 선정된다면 저거부터 PR을 날려야겠다고 생각하고 있다...)

 

잘 되나 했는데, 설치 과정에서 일부 문제가 발생하였고, 1차 시도는 실패하였다.

 

LZMA (XZ)를 지원하지 못한다는 에러가 났는데, 우선 문제가 무엇인지 확인하기 위해 LZMA가 무엇인지 알아보았다.

간단하게 말하자면, LZMA는 무손실 압축 알고리즘으로, 기존에 존재하는 압축 알고리즘에 비해 우수하여 점점 많이 사용되고 있는 알고리즘이라고 한다.

 

아마 문제가 발생하는 이유는

- 관련 패키지가 설치되지 않았거나,

- 시스템에 관련 파일이 존재하는 않기 때문일 것이다.

 

후자를 먼저 의심하고, 관련 파일을 설치해보았다.

sudo apt install lzma liblzma-dev

liblzma-dev는 설치가 이미 되어 있었고, lzma가 추가로 설치되었다.

 

그러나 문제는 해결되지 않았기에, 관련된 문제를 갖고 있는 스크립트 부분을 확인해보았다.

 

check_python() {
  pyenv shell "${PYTHON_VERSION}"
  local _pyprefix=$(python -c 'import sys; print(sys.prefix, end="")')
  python -c 'import ssl' > /dev/null 2>&1 /dev/null
  if [ $? -ne 0 ]; then
    show_error "Your Python (prefix: ${_pyprefix}) is missing SSL support. Please reinstall or rebuild it."
    exit 1
  else
    echo "SSL support: ok"
  fi
  python -c 'import lzma' > /dev/null 2>&1 /dev/null
  if [ $? -ne 0 ]; then
    show_error "Your Python (prefix: ${_pyprefix}) is missing LZMA (XZ) support. Please reinstall or rebuild it."
    exit 1
  else
    echo "LZMA support: ok"
  fi
  pyenv shell --unset
}

우리에게 문제가 된 부분은 "Your Python (prefix: ${_pyprefix}) is missing LZMA (XZ) support. Please reinstall or rebuild it." 이 부분이었기 때문에, lzma을 import 하는 과정에서 문제가 발생했을 수 있을거라고 판단했다.

 

그러나 직접 돌려보니 lzma는 잘 import 되었다.

 

???

 

다시 오류를 관찰해보니, print(sys.prefix, end="") 부분에서 에러가 한 번 더 났다는 것이 눈에 띄였다.

맞다. 이 문제는 pyenv가 제대로 작동하지 않아 python 커멘드가 우분투 시스템에 내장된 python2를 실행시킴으로써 발생한 문제다.

 

기존까지 venv만 사용했기 때문에, pyenv 환경 구축 방법을 잘 몰랐어서 열심히 구글링을 해보았지만 대부분의 가이드가 전부 제대로 동작하지 않았다. (정확히 말하면 대부분의 기능은 잘 동작했으나, pyenv shell 기능'만' 동작하지 않았다.)

 

그러다 pyenv 깃허브 페이지 이슈에서 흥미로운 내용을 보게 되었다.

https://github.com/pyenv/pyenv/issues/1959

 

Path no longer set by pyenv init - in a CI setup · Issue #1959 · pyenv/pyenv

Too many issues will kill our team's development velocity, drastically. Make sure you have checked all steps below. Prerequisite [x ] Make sure your problem is not listed in the common build pr...

github.com

https://github.com/pyenv/pyenv-virtualenv/issues/391

 

Pyenv Activate Fails · Issue #391 · pyenv/pyenv-virtualenv

I have recently encountered pyenv-activate failing with the following error on a machine which previously did not show this error. $ pyenv activate devenv Failed to activate virtualenv. Perhaps pye...

github.com

 

정확한 이유는 파악하기 어려우나, 2021년 5월 중순을 기점으로 기존에 pyenv가 동작하기 위해 ./bashrc나 ./zshrc에 작성된 명령어가 완벽하게 동작하지 않는다는 이야기였다.

 

Backend.ai 설치 스크립트에서 pyenv installation 관련 부분을 가져와보면,

 

# Install pyenv
read -r -d '' pyenv_init_script <<"EOS"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOS
if ! type "pyenv" >/dev/null 2>&1; then
  # TODO: ask if install pyenv
  show_info "Installing pyenv..."
  set -e
  curl https://pyenv.run | sh
  for PROFILE_FILE in "zshrc" "bashrc" "profile" "bash_profile"
  do
    if [ -e "${HOME}/.${PROFILE_FILE}" ]
    then
      echo "$pyenv_init_script" >> "${HOME}/.${PROFILE_FILE}"
    fi
  done
  set +e
  eval "$pyenv_init_script"
  pyenv
else
  eval "$pyenv_init_script"
fi

다음과 같은데, 3~6번째 줄을 .zshrc나 .bashrc 파일에 삽입하는 과정이 포함되어 있다.

 

위에서 언급한 이슈에 따르면, 현재는 eval "$(pyenv init --path)" 을 추가로 삽입해야 정상적으로 작동한다고 언급되었고, 실제로 그렇게 진행한 결과 해당 문제는 넘기게 되었다.

 

이번에는 Docker 관련 오류들이 조금 보였으나, 크게 어려움을 겪지 않고 해결하였다.

 

가장 먼저 발생한 오류는 "ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?" 에러였는데, 이 부분은 Docker Desktop을 설치하고,

 

 

다음과 같이 설정 -> Resources -> WSL INTEGRATION에서 사용하는 WSL 버전을 Enable 해주면 된다.

 

또, Docker를 설치하지 않고 Backend.ai를 받아서 처음 Docker를 설치하게 되면 다음과 같은 에러를 볼 수도 있는데,

이 부분은 ~/.docker/config.json을 다음과 같이 수정하면 된다.

 

 

여러 우여곡절을 끝으로 설치에 성공했다!

 

 

 

테스트 삼아 돌려보았다.

오랜만에 삽질하니까 재미도 있지만 역시 힘든건 매한가지다...

특히 pyenv 설정하는 부분에서 상당한 시간을 할애한건 조금 아쉬웠다.

 

최근 모 회사에서 실습 코치로 일했었는데, 수강생들에게 WSL2 시스템을 구축하는 방법을 설명하고 설치를 시도해보락고 권유했던 적이 있었다. 그때 다들 엄청 끙끙댔었는데, 오늘 이걸 해보면서 그 수강생들의 기분을 체험 (?? 했었던 것 같다.

 

pyenv 쪽 문제를 조금 더 살펴보고, PR 한 번 넣어봐야겠다는 생각이 든다.