본문으로 건너뛰기

포크리프트 활용하기

· 약 13분
Sujin Kim
Kangmin Kwon

포크리프트가 무엇인가요?

Backend.AI의 포크리프트는 연산 세션에 사용할 도커 컨테이너 이미지를 자동으로 생성해주고 최적화된 배포를 지원해주는 서비스입니다. 타겟 장치별로 이미지 환경을 다르게 구성해야 하거나, 배포해야 하는데 도커 파일 작성 방법을 모르겠다 하시는 분들에게 굉장히 반가운 소식일 텐데요. 포크리프트를 사용하면 source, target image만 설정해서 간단하게 커스텀 이미지를 빌드할 수 있습니다.

포크리프트의 탄생 배경

Backend.AI를 사용하면 연산 세션에서 제공하는 여러 기능을 이용할 수 있습니다. 물론 Backend.AI에서 제공하는 preset 이미지가 있지만, 사용자가 기존에 사용하던 이미지로 작업하고 싶다면 해당 이미지에 Backend.AI 관련 설정을 추가하여 이미지를 다시 빌드해야 합니다. 이미지 관련 지식이 있으신 분들이더라도 이 작업은 귀찮고 복잡합니다. 이를 해결하기 위해서 GUI 혹은 OpenAPI로 이미지를 자동 빌드해주는 포크리프트의 필요성이 대두되었습니다.

포크리프트로 빌드하기

포크리프트는 OpenAPI와 GUI 환경을 모두 지원하고 있습니다. 먼저 GUI 환경에서 어떻게 빌드하는지 살펴보겠습니다.

포크리프트 서비스에서 로그인하고 제일 처음 보이는 화면은 위와 같습니다. Summary 페이지의 왼쪽 위에는 빌드 페이지로 바로 넘어갈 수 있는 Build 버튼이 있고, 그 옆에는 지금까지 빌드를 진행한 작업의 상태를 한눈에 파악할 수 있는 도표를 보여줍니다. 아래에는 사용자가 설치한 이미지들이 어떤 것들이 있는지 보여줍니다.

이미지를 빌드하려면 Start Menu의 BUILD 버튼을 누르거나, 사이드 메뉴의 Builder를 클릭하여 아래와 같이 빌더 페이지로 넘어갑니다.

Builder 페이지

기반이 될 이미지를 Source docker image 에, 소스 이미지를 기반으로 새롭게 생성할 이미지를 Target docker image 에 입력합니다. 예를 들어 my.reg.com/test/ngc-tensorflow:19.07-py3 등과 같이 레지스트리 (my.reg.com), 네임스페이스(test), ngc-tensorflow(이름), 19.07-py3(태그)를 모두 적어줍니다. 이미지에 따라 네임스페이스는 없을 수도 있습니다. 이때 이 소스 이미지는 지정한 도커 레지스트리(이 경우 my.reg.com)에 이미 올라가 있는 상태여야 합니다. (이후에는 호스트에 존재하는 이미지를 소스 이미지로 사용할 수 있는 기능을 지원할 예정입니다.)

이 상태로 바로 빌드해도 되지만, 아래와 같이 몇 가지 옵션들을 추가하여 사용자에 원하는 이미지로 커스터마이징 할 수 있습니다.

  • 자원 제약
    Minimum required CPU cores, Minimum required memory size 등의 옵션을 설정하여 생성하려는 이미지가 요구하는 최소 자원을 제약할 수 있습니다.
  • 서비스 포트(Supported service ports)
    서비스 포트를 지정하면, 특정 서비스를 컨테이너의 특정 포트로 열게 됩니다. 사용자는 서비스 포트에 등록된 서비스를 Backend.AI 환경을 통해 활용할 수 있습니다. 예를 들어, jupyter를 http 프로토콜을 이용해 컨테이너의 8080 포트에 열게 하면 사용자가 Jupyter Notebook 앱을 실행할 때 8080 포트로 접속을 시도하게 됩니다. 물론, 이미지 내에 Jupyter가 설치되어 있지 않았으면 컨테이너 포트만 열리고 서비스는 실행되지 않습니다.
  • 환경 변수(Set environment variable)
    컨테이너 내부에 쓰일 간단한(배열이 아닌) 환경 변수를 추가할 수 있습니다.
  • 커스텀 패키지(Custom packages)
    사전에 설치하고 싶은 apt / pip / conda 패키지를 지정할 수 있습니다.
  • 이미지 자동 푸시(Auto push docker image)
    Auto push docker image 옵션으로 새롭게 생성한 이미지를 도커 허브로 푸시할 수 있습니다. 레지스트리는 Source docker image 옵션에 작성한 것으로 지정됩니다.
  • 루트 권한 허용(Allow root)
    Allow root 옵션을 허용하면 일반 유저가 sudo 명령어를 사용하여 root 권한의 명령을 내릴 수 있습니다.

모든 설정을 마치셨다면, 하단에 있는 BUILD 버튼을 눌러 빌드를 시작합니다.

빌드 중인 이미지 확인하기

Tasks 페이지로 이동하면 TASK 탭에서 '빌드 중인 이미지(Running) / 빌드 예정인 이미지(Pending) / 빌드를 완료한 이미지(Completed) / 빌드 중 에러가 발생한 이미지(Error)'를 확인할 수 있습니다. 아래 사진은 cr.backend.ai/stable/python:3.8-ubuntu18.04 이미지를 기반으로, testing:3.8-ubuntu18.04 를 빌드했을 때의 모습입니다.

빌드 중인 이미지

LOGS 탭을 누르면 현재 빌드 과정이 어떻게 진행되고 있는지 실시간 로그를 확인할 수 있습니다.

실시간 로그

이미지 빌드를 요청했으므로 Summary 페이지에 있는 Tasks 도표가 갱신되었고, 빌드 완료 후 Environments 페이지의 IMAGES 탭에서 방금 설치된 이미지가 추가되었음을 볼 수 있습니다.


OpenAPI를 이용하여 빌드하기

GUI를 사용하지 않고 OpenAPI를 통해서도 포크리프트를 사용할 수 있습니다. 포크리프트의 서버는 FastAPI1로 구축하였는데, FastAPI의 기능 중의 하나로 Swagger(OpenAPI) 기반의 자동 문서화를 제공합니다. 이를 통해 쉽게 API를 이용 및 테스트할 수 있습니다.

OpenAPI

우선 API를 이용하기 위해서는 인증이 필요합니다. 위 사진에서는 잘려 보이지 않지만, 위의 API 중 /register/ 를 통해서 회원가입을 하면 사진의 자물쇠가 채워진 API 사용에 인가를 얻을 수 있습니다. 만약 기존에 GUI를 통해서 회원가입을 마쳤다면, 우측 상단의 Authorize 버튼을 눌러 기존에 등록한 계정으로 로그인할 수 있습니다.

이제 이미지를 빌드할 수 있는 권한이 생겼습니다. 이미지를 빌드하기 위해서는 /build/general_submit//build/preset_image/ 를 이용하면 됩니다. 전자는 사용자가 글 윗부분의 GUI 설명처럼 사용자가 직접 이미지를 커스터마이징 하여 이미지를 빌드하고 후자는 Backend.AI에서 제공하는 preset 이미지들로 사용자가 커스터마이징 없이 간편하게 이미지를 빌드할 수 있습니다. /build/preset_image/ 는 아직 개발 중이므로 /build/general_submit/ 을 한 번 살펴보겠습니다.

general_submit

Request body를 들여다보면 아래와 같이 이미지 빌드 서버에서 이미지를 빌드하는데 필요한 정보들을 담고 있습니다. 각 field에 대한 설명은 위에서 이미 설명했기 때문에 넘어가도록 하겠습니다.

각 field에 대한 설명

build/general_submit/ 의 좌측 상단의 try it out 버튼을 눌러 각 field에 대한 value들을 사용자에게 맞게 설정하고 Execute 버튼을 누르면 해당 route에 POST 요청을 보내 이미지 빌드 서버가 빌드를 시작합니다.


이미지 빌드 과정은 서버 내부에서 Background Task로 진행되기 때문에 사용자는 빌드 요청에 관한 실패 또는 성공에 대한 응답을 바로 받아 볼 수 있습니다.

응답

빌드가 완료되면 docker images 명령을 통해서 빌드된 이미지를 확인할 수 있습니다.

docker images

이외의 부가적인 기능으로

  • 이미지 빌드 스케쥴에 대한 상태 정보 및 요청 사항 확인
  • 이미지 빌드에 사용된 Dockerfile 미리보기 및 다운로드 기능
  • 호스트에 생성된 이미지 리스트 확인, 삭제 및 inspect 기능
  • 현재 띄워져 있는 container 확인 기능
  • container commit 기능

등이 제공됩니다.

정리

이 글에서는 포크리프트에 대한 간략한 소개와 GUI 및 OpenAPI에서의 사용법을 소개했습니다.

요약하자면 포크리프트는 사용자가 가지고 있는 이미지를 Backend.AI에 도입함으로써, 연산 세션에서 제공하는 여러 기능을 사용하기 위한 이미지로 자동 빌드해 주는 서비스를 제공합니다.

래블업은 Make AI Accessible 이라는 철학을 기반으로 움직입니다. 포크리프트도 '사용자가 쉽게 이미지를 빌드할 수 있어야 하지 않을까?' 라는 우리의 모토에 기반한 의문에서 출발하였습니다. 아직 베타 단계의 서비스이지만 사용자 관점에서 쉽게 AI 연구 및 배포를 할 수 있도록 여러 기능 개발에 박차를 가하겠습니다.

1 FastAPI: 공식문서 링크