태그 : 오픈소스

  • Uncharted AI: 대 AI 시대

    By 래블업 주식회사

    해당 글은 2024년 9월 24일, lab | up > /conf/4에서의 신정규 대표 기조 연설을 요약한 글입니다.

    2024년 9월 24일, 래블업의 4번째 컨퍼런스, lab | up > /conf/4가 열렸습니다. 래블업의 직원들 뿐만 아니라 다양한 외부 연사 분들이 참여하여 자리를 빛내 주셨는데요, 해당 행사의 기조연설은 래블업의 CEO, 신정규 대표가 맡아 주었습니다.

    Photo by 'iT dongA'

    이번 글을 통해 신정규 대표가 기조 연설을 통해 소개한 AI 시대의 발전, 앞으로의 래블업의 방향성, 그리고 래블업이 개발하고 있는 제품들에 대한 업데이트와 몇가지 새로운 제품들에 대해 소개하고자 합니다.

    Uncharted Waters

    이번 기조연설의 제목인 <Uncharted AI - 대 AI시대'는 많은 분들이 추억하는 명작 게임, '대항해시대 - Uncharted Waters'에서 가져왔습니다. 대항해시대는 단순한 게임이 아닙니다. 이 시대는 실제 존재했던 우리 지구촌의 역사이기도 하며, 중요한 의미를 가지는 시대입니다.

    대략 15세기 이후, 대항해시대에는 수많은 사람들이 향신료를 찾아 먼 바다 너머로 여행을 떠났습니다. 지금은 어디서나 구할 수 있는 '후추'를 찾기 위해서였죠. 우리는 그 시대에 태어나진 않았으니, 저는 후추를 찾기 위해 열심히 게임을 했죠. 지금 생각하면 그깟 향신료가 뭐라고 싶지만, 당시 수많은 모험가들은 자신들의 목숨을 걸어가며 향신료를 찾아 떠났습니다.

    Uncharted AI

    그 시절 향신료를 찾아 바다 건너 목숨을 걸고 모험을 떠났던 수많은 사람들처럼, 지금 우리는 인공지능(AI)이라는 새로운 시대를 맞이하여, 인공지능을 발전시키기 위해 목숨을 걸고, 다양한 파트너들과 함께 노력해 나가고 있습니다. 왜 이런 노력이 필요하느냐, 그것은 바로 '접근성' 때문입니다. 후추를 내 집 앞마당에서 수확할 수 있다면, 굳이 바다를 건너야 할 필요가 없겠죠. 새로운 시대가 시작되었을 때, 이런 접근성의 차이가 누군가에게는 기술격차를 만들어내기도 하고, 누군가에게는 도전의 기회를 만들어내기도 하는 것입니다. 새로운 기술로 인해 생겨난 기술 격차는 래블업이 새로운 시대를 열어젖히는 원동력이 되었습니다.

    래블업의 모토는 2015년 창립 초기부터 명확했습니다. 우리는 Make AI Accessible을 목표로 기술의 접근성을 높이고, 장벽은 낮추는 것을 핵심 미션으로 삼았습니다. AI 기술을 단순히 API 형태로만 사용하는 것이 아니라, 사용하는 사람이 인프라스트럭처에 대한 기술 자체를 이해하고 사용할 수 있도록 하자. 이를 통해 수많은 사람들이 AI에 접근하는 장벽을 낮추자는 것을 목표로 삼았습니다.

    AI 분야가 발전하며 새로운 도전이 나타났습니다. 바로 스케일의 문제입니다. AI 기술이 다루는 데이터의 규모가 커지고, 연산의 규모가 커지며 과거에는 싱글 노드로 감당했던 수준을 넘어 멀티 노드가 되고, 수십 수천대, 몇 만대의 GPU를 다루는 시대가 되었죠. 동시에, AI는 작아지고 있기도 합니다. 올해 초 삼성이 공개한 Galaxy AI, 애플이 얼마 전 공개한 Apple Intelligence처럼 여러분의 손 안에서 온디바이스로 동작하는 AI도 있고, IoT 센서와 같은 온도계에도 AI가 돌아가고 있습니다.

    그러니까, 더 높은 전력과 많은 리소스를 사용하여 AI를 돌리려는 시도가 이어짐과 동시에, 더 낮은 전력과 적은 리소스를 사용해서 AI를 돌리려는 시도들도 꽃을 피우고 있는 것입니다. 기존에 우리가 AI라고 생각했던 어떠한 범위가 있다면, 그 범위가 위로 (크게) 확장되는 동시에 아래로 (작게) 축소되고 있기도 한 것입니다. 그리고 양 쪽 방향으로 스케일 밴드를 이동시키는데 필요한 기술은 완전히 다르죠.

    래블업이 사업을 시작했던 2015년만 해도 지포스 GTX970만으로도 모델을 만들 수 있었지만 지금은 워크로드의 규모가 너무나도 빨리 커지고 있기 때문에, 이 워크로드의 증가가 무어의법칙이라 부르는 반도체의 성능발전을 넘어서게 된 지가 벌써 4~5년이 지났습니다. 그렇기에 이젠 수직으로 칩의 성능이 증가하는 것이 아니라, 여러개의 칩을 묶어 수평으로 활용하는 시대가 된 것이죠.

    Make AI "Scalable"

    최근 4년 사이 AI 분야에서의 분산 컴퓨팅 패러다임이 급격히 진화하고 있습니다. 패러렐 프로세싱을 넘어 이제는 다양한 종류의 연산이 동시다발적으로 일어나고 있습니다. 데이터를 처리하고, 모델을 학습시키고, 서비스를 제공하는 등 이질적인 작업들이 한데 어우러집니다. Heterogeneous computation resource가 동시에 요구되고 일부는 데이터베이스, 일부는 트레이닝, 일부는 데이터 가공, 일부는 플릿 관리 및 RAS… 더 많은 부분이 서비스 스택에 가까워졌습니다.

    게다가 이 모든 작업에 GPU와 같은 가속기가 필수불가결해졌습니다. 이제 우리는 단순히 CPU와 GPU를 분리해서 사용하는 게 아니라, 두 자원을 더욱 긴밀하게 연동해야 합니다. 기존의 GPU 기반 서비스 + CPU 서비스로 나누는 대신, 두 종류의 리소스가 더 강하게 결합되기 시작한 것이죠. 이같은 변화의 근본 원인은 모든 서비스에 GPU가 필요해졌기 때문입니다. 이런 상황에서는 전력, 네트워크, 데이터 등 물리적인 제약 뿐 아니라, 하드웨어 불안정, 플랫폼 관리, 소프트웨어 결함 등 비물리적인 제약들까지도 모두 병목으로 작용하게 됩니다. 래블업은 이런 스케일링의 장벽을 걷어내는 데 주력하고 있습니다.

    이것이 바로 래블업이 올 해 새로 내건 목표, Make AI Scalable입니다. 우리는 가속장치부터 싱글 노드를 거쳐 하이퍼스케일에 이르는 모든 범위에서 AI 워크로드의 확장성을 추구합니다. 스케일링에 방해되는 모든 요소를 없애고, 스케일링에 필요한 모든 요소를 더합니다. 그리고 그 과정에서 AI 기술에 대한 접근 장벽을 계속 허물고 있기 때문에, 우리의 새로운 목표는 "Make AI Accessible"이라는 기존 목표에서 이어지죠.

    그동안 래블업은 AI를 Accessible하고, Scalable하게 만들기 위한 다양한 노력을 이어왔고, 이는 다양한 혁신으로 이어졌습니다. 이러한 결과로, Backend.AI로 운영되는 엔터프라이즈 GPU 유닛의 숫자는 13,000개에 육박하며, 단일 사이트 기준 1,500개 이상의 GPU를 관리하고 있는 경우도 있습니다. 래블업의 제품을 사용하는 팀(고객사)도 100여개 이상으로 확장되었죠. 클라우드 서비스, AI 가속기 테스트베드, 자율주행 등 다양한 분야에서 Backend.AI는 AI의 핵심 인프라로 자리잡았습니다.

    이러한 대규모 확장은 기술적 난이도를 크게 높였습니다. 우리는 한 대의 서버부터 수천 대의 클러스터까지, 모든 스펙트럼을 아우르는 기술을 개발해야만 했습니다. 그 기술은 앞에서 말씀드렸듯, "스케일링에 방해되는 모든 요소를 없애고, 스케일링에 필요한 모든 요소를 더하는" 것입니다. 이번 기회를 통해 래블업이 지금까지 이뤄낸 혁신과 앞으로 이뤄낼 혁신, 우리가 그리고 있는 미래에 대해 공유드리겠습니다.

    Open Source

    먼저, 래블업은 오픈소스 생태계에 깊이 관여하고 있는 오픈소스 기업입니다. Backend.AI, Callosum, aiodocker, aiomonitor(, aiotools), Raftify등 다양한 프로젝트를 개발하고 공개하고 있습니다. 오픈소스는 우리의 DNA에 새겨져 있습니다. 우리가 만들어 공개하거나 기여하는 오픈소스들의 배포 이식성은 적은 노력으로도 다양한 온프레미스 환경을 커버하는 래블업의 핵심 경쟁력이기도 합니다. Backend.AI의 온프레미스 환경에 대한 지원, 클라우드 환경과의 호환성 등은 모두 오픈소스 경험으로부터 래블업이 확보한 역량이라 할 수 있습니다.

    Backend.AI CLI Installer: TUI로 경험하는 쉬운 설치 경험

    Backend.AI CLI Installer는 Backend.AI에 대한 접근성을 높이기 위한 새로운 오픈소스입니다. TUI (Text-based User Interface)를 도입하여 쉽게 Backend.AI를 설치할 수 있고, 패키지 기반 설치를 자동화하며, 자동 설치용 메타 설정을 지원합니다.

    bndev: 나만의 AI 인프라를 손쉽게

    단순 패키지 기반 설치가 아니라, 내가 직접 뜯어 고치며 해킹하고 싶은 분들을 위해 bndev라는 개발도구를 공개했습니다. bndev를 통하면 복잡한 Backend.AI 개발 환경을 손쉽게 구축하고 관리할 수 있습니다. 모두가 자신만의 AI 인프라를 가질 수 있고 고칠 수 있게 되는 것이죠.

    Backend.AI Core

    Backend.AI는 매 년 3월과 9월에 메이저 버전 릴리즈를 진행합니다. 2024년 3월에는 24.03 버전을 릴리즈했고, 곧 24.09 버전의 릴리즈를 눈앞에 두고 있습니다. 24.09 버전과 그 이후의 버전에도 영향을 미칠 요소로, Backend.AI Core에 큰 변화가 있습니다. 해당 내용을 소개드리겠습니다.

    Key Updates

    • NVIDIA NGC(NVIDIA GPU Cloud) NIM(Nemo Infrerence Microservice) 실행 지원: 라이선스 기반 컨테이너 이미지 적재 등 NGC의 주요 기능을 Backend.AI에서 활용할 수 있습니다.
    • Intel Gaudi2, Rebellions ATOM+, Furiosa RNGD 등 신규 가속기 지원 대폭 확대: Backend.AI 내에서 고객의 워크로드 특성에 맞는 최적의 AI 가속기를 유연하게 선택할 수 있습니다.
    • Backend.AI 모델 스토어, 브라우저, 서빙 기능 정식 출시(GA): MLOps의 핵심 기능을 아우르는 원스톱 솔루션으로, 고객이 손쉽게 AI 모델을 검색하고, 자신의 워크로드에 바로 배포할 수 있습니다.
    • 작업 스케줄링 체계 강화: 새로운 Priority Scheduler를 통해 작업의 우선순위를 스케줄러와 독립적으로 지정할 수 있으며, 중요도가 높은 작업을 빠르고 안정적으로 처리할 수 있습니다.
    • Agent Selector 개념 도입: Agent Selector는 스케줄러가 선택한 작업을 실제로 어떤 노드에서 실행할지를 결정하는 역할을 합니다. 이제 이 부분도 독립된 플러그인 형태로 쉽게 사용자 정의할 수 있습니다. 이를 활용하면 작업을 각 노드의 전력 사용량이나 온도 등 다양한 기준에 따라 분산 배치할 수 있습니다. 노드 간 부하를 균등하게 맞추고, 전력 효율을 높이는 등 인프라 운영을 최적화하는 데 큰 도움이 될 것으로 기대합니다.
    • 자체 Docker 네트워크 플러그인 개발: 대규모 데이터 처리를 위한 GPUDirect Storage 지원 범위를 넓혀, 단일 노드 안에서의 데이터 이동 병목을 최소화하였습니다.
    • 컨테이너 간 통신을 위한 Cilium 기반의 네트워킹 스택 도입: 대규모 분산 학습에 도움이 되는 기능으로, 해당 스택을 통해 기존 대비 30%의 네트워크 성능 향상을 확인했습니다.
    • OIDC(OpenID Connect) 기반의 통합 인증 체계 확보: 단일 계정으로 Backend.AI를 포함한 다양한 인프라 서비스에 접근, 계정 관리가 대폭 간소화됩니다.
    • 엔터프라이즈 환경 지원 대폭 확대: GitLab, GitHub Enterprise, AWS ECR 등 다양한 PrivateContainer Registry와의 연동이 가능하며, 기업 내부 레거시 자원과 클라우드를 모두 아우르는 하이브리드 구성도 쉽게 구성할 수 있습니다.

    위와 같은 업데이트를 기반으로, Backend.AI는 고성능 컴퓨팅(HPC)을 위한 기능과 엔터프라이즈를 위한 기능을 모두 갖춘 차세대 AI 인프라스트럭처로서의 면모를 확장해 나가고 있습니다. 향후 자세한 업데이트 내용은 Backend.AI 24.09 출시와 함께 확인할 수 있습니다.

    Next-gen Sokovan

    래블업은 내년 초 출시를 목표로 차세대 Sokovan에 대한 작업도 이어나가고 있습니다. 차세대 Sokovan에 대한 내용을 간략하게 공개합니다.

    • 쿠버네티스를 지원하는 듀얼 엔진 아키텍처: 기존의 독자적인 클러스터 관리 체계와 함께, 쿠버네티스 네이티브 서비스로도 동작하게 됩니다. 이를 위해 쿠버네티스 오퍼레이터 프록시를 통한 가속기 관리 기능을 탑재할 예정입니다. NVIDIA와 AMD의 각종 디바이스 플러그인, 인텔 GPU 플러그인 등을 매끄럽게 연동, 업계 표준을 지원하게 되는 것이죠.
    • HA 구성 시 Raftify를 활용한 DB 부하 분산 기술 적용: 메타데이터 서비스에 대한 병목 현상을 최소화하고, 수만 대 규모 클러스터에서도 안정적인 운영이 가능해집니다.
    • 거대언어모델 서빙을 위한 자동 스케일링 강화: 단순 리소스 사용량뿐 아니라, 요청 패턴과 레이턴시 등 API 메트릭을 종합적으로 분석해 최적의 스케일링을 수행합니다.
    • 프로젝트 단위 강화: 데이터 세트와 모델, 파이프라인 등을 하나의 단위로 묶어 관리할 수 있게 됩니다. 이를 통해 세밀한 **RBAC(Role-Based Access Control)**를 적용해 다양한 협업 시나리오를 지원하는 것이 목표입니다.
    • 엔터프라이즈 고객을 위한 관리 기능 강화: 통합 로깅과 모니터링은 물론, 규제 준수를 위한 감사 로그 추적 기능을 갖추게 됩니다.

    이 모든 변화는 한 가지 목표를 염두하고 만들어지고 있습니다. 바로 고객의 AI 프로젝트를 가속화하는 것이죠. 래블업의 개발팀은 신규 AI 가속기를 비롯해 각종 쿠버네티스 기반 솔루션과의 연계를 통해 Backend.AI Core 및 MLOps 기능의 성숙도를 한 층 더 높여갈 수 있을 것으로 기대하고 있습니다. 더욱 폭넓은 역할을 수행하게 될 차세대 Sokovan의 여정을 기대해 주시기 바랍니다.

    Backend.AI WebUI

    빠른 시일 안에, Backend.AI WebUI는 새 옷을 입습니다. 사용자 관점에서 Backend.AI의 첫인상을 결정짓는 가장 중요한 요소는 바로 사용자 인터페이스일 것입니다. 우리는 그동안 WebUI의 중요성을 깊이 인식하고, 꾸준하게 혁신을 거듭해 왔습니다. 다양한 사용자 경험 테스트를 위해 작년에는 ML Desktop을, 올해 초에는 GenAI Desktop을 출시하기도 했죠. 최근에는 Neo Session Launcher를 통해 사용자 친화적인 UI를 제품에 적용하기도 했습니다.

    WebUI의 세 번째 새로운 변화, WebUI Neo를 소개합니다. Vice Versa Design Studio와의 긴밀한 협업을 통해 풍부한 사용자 경험을 제공하는 것을 목표로 설계되었죠. 이 새로운 디자인 언어는 처음부터 끝까지 사용자를 고려하고 설계되었습니다. Backend.AI 리뉴얼에 맞춰 UI/UX 전반을 재설계하여 한 층 세련되고, 미래지향적인 분위기를 느낄 수 있을 것입니다.

    WebUI Neo는 '인지 부하의 감소'와 '시각적 은유의 일관성 유지'를 콘셉트로 설계되었습니다. '인지 부하의 감소' 측면에서, 우리는 사용자가 복잡한 정보를 입력하거나, 탐색해야 하는 상황을 최소화하고자 하였습니다. 예를 들어, 대규모의 실험을 설정하는 경우 수십가지의 옵션을 한 번에 늘어놓는 것 보다는 순차적으로 정보를 노출하여 단계별로 확인 가능한 정보의 양을 제한했습니다.

    '시각적 은유의 일관성 유지' 측면에서는, 실험과 모델, 데이터 세트 등 유사한 개념에 대해 화면 구성, 아이콘, 색상에 이르기까지 UI/UX 요소를 유사하거나 동일한 디자인 패턴으로 구성하여 사용자가 한 번 익힌 사용법을 유사 기능을 사용하며 재학습할 필요 없이 재사용할 수 있도록 하였습니다. WebUI Neo는 Core 및 엔터프라이즈에 걸쳐 모두 적용됩니다.

    이러한 혁신성을 인정받아, WebUI Neo는 이번 달 서울특별시와 서울디자인재단에서 주관한 중소기업 산업디자인개발 지원사업에서 총 4개의 컨소시엄에게만 주어지는 우수상을 수상했습니다.

    WebUI Neo는 Backend.AI 24.09 업데이트에 바로 포함되지는 않으며, 올해 연말 정식 출시를 목표로 개발과 테스트가 진행되고 있습니다. WebUI의 첫 버전부터 사용되었던 코드베이스인 웹 컴포넌트 기반에서 리액트 기반으로 이전하는 작업도 한창 마무리 중에 있습니다. WebUI Neo는 단순히 과거의 기능을 재포장하는 선에서 그치지 않습니다. 머신러닝 워크플로와 긴밀하게 연계된 새로운 기능들이 지속적으로 추가될 예정이고, Backend.AI가 추구하는 고도의 자동화와 사용 편의성을 구현하기 위한 기반이 될 것입니다. AI 인프라스트럭처의 복잡성을 넘어 모두가 AI 인프라스트럭처를 쉽게 이해하고 그 혜택을 누리는 세상, 래블업이 WebUI Neo를 통해 그려가는 미래입니다.

    Lablup Enterprise

    Backend.AI Enterprise 를 중심으로 하는 Lablup Enterprise 의 핵심은 ___ made easy 로 표현할 수 있습니다. Lablup Enterprise는 디바이스 드라이버 레벨부터 AIOps까지 엔드 투 엔드 기술로 깊은 단계에서의 AI 기술 혁신을 쉽게 제공하는 것을 목표로 합니다. 저희는 총 3개의 ___ made easy 콘셉트를 잡고 있는데요, 첫번째는 "Scaling made easy", 두번째는 "Acceleration made easy", 마지막은 "Inference made easy" 입니다.

    Scaling made easy: FastTrack 2, Finetun.ing, Cluster Designer

    FastTrack 2

    래블업이 24.09와 함께 릴리즈하는 FastTrack 2는 대규모의 AI 프로젝트를 위한 자동화 솔루션입니다. 프로젝트 그룹 기반의 파이프라인 관리 기능을 제공해, 복잡한 워크플로를 손쉽게 정의하고 실행할 수 있습니다. 다양하고, 재사용 가능한 템플릿을 제공하여 반복적인 작업을 최소화시키는 것을 큰 특징으로 가지고 있습니다. 또한, FastTrack 2에서는 외부 파트너와의 연계를 통해 자원을 더욱 유용하게 활용할 수 있게 됩니다. 파트너사의 모델 압축 노드와 모델 서빙 서비스를 파이프라인에 추가할 수 있습니다.

    Finetun.ing

    Finetun.ing은 FastTrack으로 개발된 클라우드 파인튜닝 서비스이며, 일반적으로 제공되는 파인튜닝 서비스와 다르게 데이터를 직접 준비할 필요가 없다는 큰 특징이 있습니다. 보통은 기반이 되는 데이터를 업로드해서 모델을 파인튜닝하는 시나리오를 많이 생각하는데, Finetun.ing은 사용자가 인터랙티브 프롬프트를 입력하는 것으로 모델 튜닝을 완료할 수 있습니다. 사용자가 플랫폼에게 거는 대화를 기반으로 플랫폼이 자동으로 합성 데이터를 생성하고, 이를 이용하여 모델 튜닝이 이루어지게 됩니다. 파인튠 완료된 모델은 자동 테스트를 거쳐 모델 카드와 함께 사용자에게 다운로드 가능한 형태로 제공됩니다. Finetun.ing은 NVIDIA NemoTron 을 기반으로 구축되어 있으며 Llama 3.1과 Gemma 2부터 지원을 시작할 예정입니다. 현재 다양한 최신 모델의 파인튜닝을 지원하기 위해 테스트를 진행하고 있고, 앞으로 더 많은 모델을 이용할 수 있도록 추가할 예정입니다.

    현재 Finetun.ing은 최종 공개를 앞두고 있고, 이번 행사에서 최초로 Waitlist를 받기로 결정했습니다. https://finetun.ing 에서 Waitlist에 등록하실 수 있습니다.

    Cluster Designer

    Backend.AI Cluster Designer는 GUI 기반의 클러스터 설계 도구입니다. 고객이 원하는 규모와 성능에 맞춰 해당 클러스터의 실효 성능과 함께 필요한 하드웨어 구성과 예상 비용을 자동으로 산출해 줍니다. 실제 구축에 앞서 최적의 아키텍처를 검증하고 싶은 분들께 안성맞춤입니다.

    Helmsman

    Backend.AI Helmsman은 대화형 클러스터 관리 인터페이스입니다. 터미널에서의 채팅만으로 복잡한 클러스터 운용이 가능해집니다. 내부적으로는 Gemma 기반의 파인튠 모델을 활용해, 사용자의 의도를 정확히 파악합니다. TorchTune, LangGraph, LangChain 등의 패키지들을 결합해 온프레미스 환경에서의 대화형 파인튜닝 파이프라인 구축도 지원합니다. Helmsman CLI 및 WebUI를 통한 UI 패키지 및 모델은 Backend.AI 24.09 릴리즈 이후, 연말까지 릴리즈할 예정입니다.

    Acceleration made easy

    두 번째는 "Acceleration made easy"입니다. 우리는 AI 워크로드를 위해 다양한 가속기를 지원하고 있습니다. 현존하는 AI 인프라스트럭처 플랫폼 중 가장 많은 가속기를 지원하고 있습니다.

    CPU 아키텍처 기준으로는 x86은 물론 Arm, RISC-V 등 이종 아키텍처까지 아우릅니다. NVIDIA의 Grace Hopper, AMD의 MI 시리즈, 인텔 Gaudi, GraphCore BOW, GroqCard, Rebellions ATOM+, Furiosa RNGD 등 최신 가속기와의 긴밀한 협업을 통해 Backend.AI 에서 동일한 사용자 경험 및 최고의 성능을 달성할 수 있도록 노력하고 있습니다.

    Inference made easy

    마지막으로 "Inference made easy" 입니다.

    저희는 통합 모델 스토어를 통해 사전학습 모델의 공유와 배포를 간소화했습니다. Hugging Face를 비롯해 자체 레지스트리, 레시피 기반 모델 빌드 등 다양한 방식을 제공하죠. 윈도우의 Choco, macOS의 Homebrew 등의 패키지매니저에서 영감을 얻은 Lablup ION 모델 레시피는 GitHub을 통해 커뮤니티가 기여한 모델 및 서비스들을 명령어 한 줄로 설치할 수 있게 합니다.

    PALI, PALI PALI (PALI2), PALANG

    모델 서비스 운영 측면에서도 새로 소개드릴 내용이 있습니다. 바로 PALI (빨리), PALI2 (빨리 빨리), PALANG (빨랑)입니다.

    PALI(Performant AI Launcher for Inference) 는 Backend.AI 모델 플레이어와 큐레이트 된 모델 카탈로그, 미리 정의된 모델을 조합한 고성능 추론 런타임입니다. 유연한 확장성과 뛰어난 성능이 장점입니다. 누구든지 쉽게 설치하고, NVIDIA NIM, Hugging Face 모델 및 Lablup ION 레시피를 바로 실행하여 모델 서비스를 운영할 수 있습니다.

    PALI2 는 PALI를 위한 전용 하드웨어 인프라 어플라이언스입니다. PALI가 탑재된 어플라이언스 여러 개를 연결해 손쉽게 확장할 수 있습니다. PALI2는 AI 워크로드에 최적화된 아키텍처로, 높은 성능과 낮은 지연 시간을 자랑합니다. 설치 환경에 따라 다양한 아키텍처 및 칩 환경에 맞춘 모델들을 제공하고 업데이트 할 수 있죠.

    NVIDIA 레퍼런스 플랫폼인 GH200을 통합한 PALI2 어플라이언스도 준비하고 있고, 일본 교세라 미라이 엔비전에서 10월 1일에 PALI2의 첫번째 레퍼런스 플랫폼으로 Instant.AI라는 플랫폼을 런칭, 여러분들이 구입할 수 있게 됩니다.

    한국 시장에서의 레퍼런스 플랫폼은 10월 중 예약, 4분기부터 판매 예정에 있습니다. 미국 및 유럽 시장을 대상으로 하는 PALI2 어플라이언스들은 빠르면 올해 4분기부터 만나볼 수 있을 것입니다.

    PALANG은 PALI와 FastTrack, Talkativot, Helmsman 등을 아우르는 언어 모델 추론 플랫폼입니다. 즉시 사용 가능한 추론 및 파인튜닝 세팅을 제공, 대규모 언어 모델의 배포와 운영을 크게 단순화했습니다. Talkativot을 통해서는 맞춤형 챗봇 인터페이스를 쉽게 만들 수 있으며, 개발 과정에서의 모델 비교 및 인터페이스 빌딩을 위한 소프트웨어 컴포넌트들도 제공합니다. 인퍼런스만 필요한 경우 PALI 및 PALI2를 사용하면 되고, 언어모델 파인튜닝과 추론이 모두 필요한 경우 PALANG을 사용할 수 있습니다.

    G

    마지막으로 원 모어 씽... 현재 개발 중인 신규 프로젝트 하나를 살짝 공개하겠습니다. Gemma2 기반의 언어 모델, G입니다. Finetun.ing으로 간편하게 커스터마이징할 수 있는 것이 특징입니다. Helmsman 의 백엔드 모델 및 기업용 에이전트 등의 다양한 용도로 사용될 예정이며 구체적인 내용은 추후에 소개드리도록 하겠습니다.

    From Uncharted AI to Industrial Revolution

    대항해시대, 무수히 많은 모험가들은 후추를 찾아 전세계를 누볐습니다. 그들의 도전은 결과적으로 미지로 남았던 세계의 다양한 영역을 발견했고, 결과적으로 그들이 개척해낸 항로를 통해 세상은 더욱 연결되었습니다. 조선술과 항해술이 발전했고, 새로운 교역로가 열렸고, 의학과 군사기술을 비롯한 다양한 분야에서 혁신이 일어났습니다. 그 뿐만이 아닙니다. 대항해시대가 축발시킨 또 다른 중요한 이벤트, 산업혁명을 빼놓을 수는 없겠죠.

    지금 우리가 마주하고 있는 이 시대를 저희는 대 AI시대라고 부릅니다. 대 AI 시대는 마치 대항해시대 초기와 같이 그 가능성의 문이 이제 막 열리기 시작한 단계에 불과합니다. 누군가는 이제 막 겨우 후추를 들고 돌아오고 있으며, 누군가는 지구가 둥글다는 것을 증명하기 위해 더 큰 배를 건조하고 띄우려 하고 있죠. 이제 AI 분야에도 대항해시대가 산업 혁명에 가져온 변화가 막 일어나고 있습니다.

    Engine of AI Infrastructure

    산업혁명은 제임스 와트의 증기 엔진으로부터 시작되었습니다. 증기 엔진이 발명되면서 대량 생산과 기계화의 시대가 열렸습니다. 이제 우리는 또 다른 혁명의 한가운데 서 있습니다. 거대한 물결 앞에서, 래블업은 새로운 엔진을 만들고 있습니다.

    래블업은 AI 인프라 분야의 엔진입니다. 우리의 기술은 산업 전반에 혁신의 동력을 제공합니다. 증기기관이 석탄의 힘을 이용했다면, 래블업의 엔진은 데이터를 연료로 삼습니다. 마치 자동차 엔진이 휘발유의 에너지를 움직임으로 전환하듯, 래블업은 데이터라는 연료를 인공지능과 인공지능이 주는 가치로 전환하는 효율적이고 강력한 엔진을 제공합니다.

    내연기관이 자동차 산업을 태동시켰듯, AI 엔진은 데이터 기반의 IT산업을 재편할 것입니다. 단순히 데이터를 저장하고 관리하는 수준을 넘어 모든 사람과 기업이 각자 보유한 데이터로부터 통찰과 가치를 이끌어내는 시대, 래블업은 그 시대를 준비하고 있습니다. 래블업의 AI 엔진은 규모와 속도 면에서 타의 추종을 불허합니다. 작게는 IoT, 크게는 수십에서 수만 대에 이르는 GPU를 동시에 가동하고, 페타바이트급 데이터를 실시간으로 처리하는 스케일을 지원합니다. 엔진의 성능이 자동차의 속도를 결정하듯, 우리의 인프라는 AI 생태계에서의 성패를 좌우할 것입니다.

    지금까지 래블업이 만들어온 엔진들을 보셨습니다. 우리는 이 엔진들로 대AI시대를 넘어 AI 산업혁명 시대를 견인해보려 합니다. 여러분 모두가 각자 모두 운전석에 앉을 수 있도록, 우리는 엔진을 설계하고 개선하는 일에 매진하겠습니다. 래블업과 함께 대AI시대의 가속페달을 밟아 주시기 바랍니다.

    27 September 2024

  • Backend.AI 오픈소스 기여 가이드 (2024년 7월)

    By 성대현

    Backend.AI의 코어 엔진은 많은 오픈소스 소프트웨어를 활용함과 동시에 그 자체도 오픈소스로 개발되고 있습니다. 오픈소스로 개발되는 만큼, 버그를 찾았거나 불편함을 느낀 사용자가 있다면 개인이 직접 Backend.AI 프로젝트에 기여하는 것 또한 가능하죠. (물론, Backend.AI를 이용하시는 엔터프라이즈 고객분들께는 저희의 고객 및 기술 지원 채널을 통해 이슈가 생길 경우 지원을 해드리고 있답니다.)

    기여를 하기 위한 방법에는 두 가지가 있는데요, 첫번째 방법은 어떤 문제가 있는지, 어떤 개선 아이디어가 있는지 상세하게 개발팀에게 설명을 남기는 'issue'이고, 두번째 방법은 직접 코드를 수정하여 기여할 수 있는 'pull request' 입니다.

    Backend.AI 오픈소스 기여 가이드 글을 통해 래블업의 개발팀과 더욱 효과적이고, 빠른 의사소통을 위해 알아두면 좋은 내용을 소개합니다.

    GitHub 저장소 소개

    이전의 글 Backend.AI 오픈소스 기여 가이드에서 보듯 Backend.AI은 원래 Backend.AI meta-repository와 여러 하위 컴포넌트들로 저장소를 구분하여 개발되었습니다.

    그러나, Backend.AI의 "22.06"버전부터는 Pants를 이용한 mono-repository 방식으로 변경되었습니다.

    이와 같은 개발 워크플로의 전환으로 다수의 개별 컴포넌트에서 종종 발생하는 패키지 호환성 문제를 해결해 더욱 편리한 개발 환경을 구성하는 데에 많은 도움이 되었습니다.

    Pants는 빠르고, 확장성이 있으며, 사용자 친화적인 빌드 시스템입니다.

    우선, 이슈를 올리고 싶다면 가장 먼저 살펴보실 곳은 Backend.AI repository입니다. Backend.AI라는 프로젝트 이름을 가진 저장소는 Pants를 이용하여 통해 여러 패키지를 통합 설치하고 있습니다. 이 저장소는 프로젝트 관리뿐만 아니라 실제로 어떤 기능을 하는 코드가 들어가는 저장소입니다. Backend.AI의 서버 및 Client SDK 관련 이슈들은 모두 여기서 관리되고 있으며, README를 통해 다른 프로젝트로의 링크를 제공합니다.

    이슈를 새로 생성할 때 기본 템플릿으로는 bug report와 feature request 2가지 양식을 제공하고 있으나, 이 양식을 꼭 엄격하게 따라야만 하는 것은 아닙니다. 다만 Backend.AI의 복잡도나 다양한 사용 환경을 고려하였을 때 해당 양식에 맞춰서 내용을 작성해주시면 문제 파악을 위한 맥락 공유가 조금 더 쉬워진다는 점을 고려해주십시오.

    Mono-repository에 대한 소개

    Backend.AI는 버전 "22.06"부터 Backend.AI는 Pants를 이용한 mono-repository로 변경하였습니다. Mono-repository는 여러 프로젝트의 기본 종속성, 데이터 모델, 기능, 툴링 및 프로세스를 공유하는 소스코드를 가지고 통합한 코드 베이스의 프로젝트입니다. 이전에 사용하던 여러 프로젝트를 하나의 프로젝트로 통합하여 저장소를 운영하고 있습니다.

    Pants 소개

    Backend.AI는 Pants를 이용한 빌드시스템으로 설치합니다. Pants에 대한 자세한 내용은 다음의 링크 Pants - Getting started를 확인하시기 바랍니다.

    Backend.AI의 컴포넌트 관계

    그림 1. Backend.AI 주요 컴포넌트 사이의 관계 구조

    그림 1은 Backend.AI의 주요 컴포넌트 관계를 나타낸 다이어그램입니다.

    그림 2. Backend.AI의 주요 컴포넌트 구조도 및 실행 방법의 예

    그림 2는 Backend.AI의 주요 컴포넌트 구조를 나타낸 다이어그램이며, 컴포넌트의 소스코드 위치 및 실행 명령등을 보여주고 있습니다.

    Backend.AI의 대다수 컴포넌트는 Backend.AI repository에서 관리되며, 소스코드는 src/ai/backend/ 하위 디렉토리에 위치하여 있습니다. 간략하게, 컴포넌트별로 하는 일에 대해 디렉토리별로 요약하면 다음과 같습니다:

    • src/ai/backend/manager (Manager): 전체 클러스터의 연산자원 모니터링 및 세션 스케줄링을 담당하고 사용자 인증 및 세션 실행 등의 API를 제공하는 핵심 서비스
    • src/ai/backend/agent (Agent): 연산노드에 설치되어 컨테이너들을 관리 및 제어하는 서비스
    • src/ai/backend/common (Common): 여러 서버 측 컴포넌트에서 공통으로 또는 자주 사용되는 기능 및 데이터 형식을 모아놓은 라이브러리
    • src/ai/backend/client (Client SDK for Python): 공식 명령 줄 인터페이스(CLI)이자 Python을 위한 API wrapper 함수·클래스들을 제공하는 라이브러리
    • src/ai/backend/storage (Storage Proxy): 사용자 웹 브라우저 또는 Client SDK가 네트워크 스토리지로부터의 대용량 입출력을 바로 할 수 있도록 해주는 서비스
    • src/ai/backend/web (Web Server): Web UI와 SPA (single-page app) 구현을 위한 라우팅을 제공하고 웹 세션 기반 사용자 인증을 제공하는 HTTP 서비스
    • src/ai/backend/webui (Web UI & Desktop App): 실제 사용자가 접하는 UI의 웹 컴포넌트 기반 구현체. Electron 기반 데스크톱 앱 빌드도 지원. 또한, 사용자가 컨테이너 내부에서 실행 중인 애플리케이션 포트로 바로 접속할 수 있도록 해주는 app proxy의 로컬 경량화 버전도 포함.

    Backend.AI의 버전 관리 방법

    Backend.AI는 6개월(매년 3월과 9월)마다 주요 릴리즈가 이뤄지며, 릴리즈 후 사후 지원을 약 1년간 제공합니다. 따라서 버전 번호는 YY.0M.micro 방식의 CalVer 형식을 따르고 있습니다 (예: 20.09.14, 21.03.8). 다만 Python 패키징 시스템의 버전 번호 정규화 때문에 wheel 패키지의 버전은 월 부분에 zero-padding이 없는 YY.MM.micro 형식입니다 (예: 20.9.14, 21.3.8). 버전 업데이트 주기가 본체 릴리즈 주기와 다른 세부 컴포넌트들은 일반 SemVer 형식을 따르고 있는 예도 있습니다.

    개발 전 우선 설치해야 하는 필수 패키지

    Backend.AI를 설치하기 전에 먼저 Docker, Docker Compose v2 등을 설치해야 합니다. Backend.AI는 repository의 scripts/install-dev.sh 스크립트로 설치 시 Docker, Docker Compose v2 등의 설치 여부를 검사하여 설치 방법을 안내합니다. 만약, Python, pyenv, Docker, npm이 설치되지 않았으면 아래와 같이 필수 패키지 설치를 해야합니다. Python의 경우는 시스템 패키지의 Python3로 설치하시기 바랍니다. 이후, pyenvpyenv-virtualenv를 설치해야 합니다.

    $ curl https://pyenv.run | bash
    

    이후 Docker와 Docker Compose v2를 다음과 같이 설치하면 됩니다.

    MacOS

    MacOS의 경우는 Docker Desktop on Mac으로 설치하면 Docker와 Docker Compose v2가 자동으로 설치됩니다.

    Ubuntu, Debian, CentOS, Fedora Core등 Linux 환경

    Ubuntu, Debian, CentOS, Fedora Core의 경우 다음의 스크립트를 이용하면 Docker와 Docker Compose v2가 자동으로 설치됩니다.

    $ sudo curl -fsSL https://get.docker.io | bash
    

    Docker 설치한 후, 만약 sudo 없이 실행하였을때 다음과 같이 unix:///var/run/docker.sock 접근 권한 오류가 생기는 이슈가 있습니다.

    $ docker ps
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
    

    위와 같은 권한 문제가 존재하는 경우 아래와 같이 명령어를 이용하여 권한을 설정합니다.

    $ sudo usermod -aG docker $(whoami)
    $ sudo chown root:docker /var/run/docker.sock
    

    이후, 재부팅을 한 후, docker run hello-world 를 실행하여, 정상 실행되는걸 확인하면 됩니다.

    $ docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    c1ec31eb5944: Pull complete
    Digest: sha256:94323f3e5e09a8b9515d74337010375a456c909543e1ff1538f5116d38ab3989
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
    3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/
    
    For more examples and ideas, visit:
    https://docs.docker.com/get-started/
    

    chown 으로 /var/run/docker.sock의 group ownership 변경이 아닌 /var/run/docker.sock 파일의 권한을 666으로 변경하여 그룹내 다른 사용자도 접근 가능하게 변경하면 재부팅을 하지 않아도 됩니다.

    sudo chmod 666 /var/run/docker.sock
    

    그러나, /var/run/docker.sock 파일의 권한을 666으로 설정하면, 보안 취약점이 생깁니다.

    Docker Compose v2 설치 여부는 다음과 같이 확인해봅니다.

    $ sudo docker compose version
    Docker Compose version v2.28.1
    

    만약, nvm이 설치되어있지 않다면 nvm을 다음의 링크 nvm - install & Update Script에 나온 것처럼 설치해야 합니다.

    $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
    

    nvm 설치 이후에는 최신 LTS 버전의 Node.js을 설치 하고 사용 설정을 하면 됩니다.

    $ nvm install --lts
    $ nvm use --lts
    

    개발 환경 설치 방법

    실제로 코드를 통해 기여하기 위해서는 pull request를 작성해야 하는데, 단순한 오타 수정 혹은 문서 기여가 아니라면 코드를 수정하며 직접 결과물을 돌려서 확인해봐야 하기 때문에 개발 환경을 구축하는 절차가 꼭 필요합니다. Backend.AI는 여러 개의 컴포넌트가 함께 맞물려 돌아가는 구조로, 하나의 저장소를 clone하고 Python 가상환경을 만들어 editable install[1]을 해주는 것만으로는 설치가 끝나지 않습니다. 최소한 manager, agent, storage-proxy, webserver, wsproxy를 모두 설정 및 실행해야만 동작하는 GUI를 확인할 수 있으며 CLI 환경을 위해서는 여기에 client SDK도 별도로 설치해야 합니다. 또한 manager 구동 및 agent와의 통신을 위한 Redis, PostgreSQL, etcd 서버도 함께 실행해야 합니다.

    앞서 소개한 필수 패키지를 설치했고, Backend.AI의 여러 컴포넌트를 설치하려면 repository의 scripts/install-dev.sh 스크립트로 설치하면 됩니다. 이 스크립트가 하는 일은 다음과 같습니다:

    • pyenv, Python, Docker, npm 등의 설치 여부를 검사하여 설치 방법을 안내
    • 위와 같은 다양한 컴포넌트들을 모두 각자의 디렉토리에 설치
      • 이때 accelerator-cuda와 같이 다른 컴포넌트의 동작에 필요한 컴포넌트들은 editable 상태로 추가 설치됩니다.
    • 각 컴포넌트가 서로 바라볼 수 있는 기본 포트 설정 및 예제 인증키 등을 포함한 database/etcd fixture 추가
    • PostgreSQL, Redis, etcd 서비스를 "halfstack"이라는 이름으로 Docker Compose를 이용해 생성 및 실행

    install-dev 스크립트 실행이 성공적으로 완료되면, manager, agent 등의 서비스 데몬을 실행하기 위한 명령어 및 기본 설정된 예제 계정 정보를 출력합니다. 설명을 따라 tmux, screen 등의 터미널 멀티플렉서 또는 터미널 앱의 다중 탭 기능 등을 활용하여 각각 독립된 shell에서 서비스 데몬들을 실행하고, hello world 예제까지 동작하는 것을 확인하면 Backend.AI를 개발 및 테스트할 수 있는 준비가 된 것입니다.

    현재 이 방법은 Intel (amd64/x86_64) 및 ARM 기반 macOS 및 Ubuntu/Debian/CentOS/Fedora 및 Docker Compose가 설치되는 배포판의 Linux 환경만 지원합니다.

    보통 처음 이 install-dev 스크립트를 이용하면 도중에 다양한 오류나 사전 검사 실패로 인해 중단하고 다시 실행해야 하는 경우가 자주 발생합니다. 이때는 scripts/delete-dev.sh 스크립트를 활용하면 삭제 절차를 간편하게 수행할 수 있습니다.

    Backend.AI 설치 및 삭제하기

    이 install-dev 및 delete-dev 스크립트를 활용하면, Backend.AI를 자유롭게 설치하고, 삭제할 수 있습니다. 먼저 Backend.AI 저장소를 복제합니다.

    $ git clone https://github.com/lablup/backend.ai 
    

    위의 Backend.AI를 설치합니다.

    $ cd backend.ai
    $ ./scripts/install-dev.sh 
    

    설치가 완료되면, 화면에 나오는 결과 내용을 숙지하시기 바랍니다.

    만약, Backend.AI를 삭제하려면 Backend.AI 저장소를 복제한 위치에서 scripts/delete-dev.sh 스크립트를 실행하면 됩니다.

    $ cd backend.ai
    $ ./scripts/delete-dev.sh 
    

    컨트리뷰션 전에 알아야 할 사항

    대부분의 분산 버전 관리 시스템에서 관리되는 프로젝트와 마찬가지로, Backend.AI 에 기여하기 위해서는 원본 원격 저장소의 main 브랜치의 가장 최신 커밋 기준으로 코드 작업이 이뤄져야 하며, 충돌이 발생하는 경우에는 리뷰를 요청하기 전에 해결되어야 합니다. 원본 저장소를 fork 한 경우, 현재 본인이 fork 한 원본 저장소와 실제 원본 저장소가 동기화되어야 합니다.

    방법 안내 전 이해를 돕기 위해 아래 정리한 명칭을 참고해주세요.

    • 원본 원격 저장소(upstream): Backend.AI 원본 저장소. 모든 주요 커밋 내용이 반영됨.
    • fork 한 원본 저장소(origin): GitHub을 통해 "내" 계정으로 복사해온 Backend.AI 저장소. (주의: 원본 원격 저장소 != fork 한 원본 저장소)
    • 코드 복사본(local working copy): 현재 본인의 로컬 머신에 내려 받은 fork 된 저장소

    Git 명령의 브랜치 표기

    • main: 현재 local working copy의 main 브랜치
    • origin/main: 내가 local working copy를 만들기 위해 clone을 수행해온 저장소(origin)의 main 브랜치
    • upstream/main: 별도로 추가한 upstream 원격 저장소에 속한 main 브랜치

    작업 흐름 개념

    • fork 하는 시점에 origin/main 이 만들어짐
    • fork 한 저장소를 clone하면 내 작업 컴퓨터에 main 이 만들어짐
    • main 으로부터 새로운 topic branch를 만들어 작업 진행
    • 이 작업 branch를 origin에 올리고 PR을 생성하면 GitHub이 알아서 fork 의 원본 저장소를 가리키도록 해줌
    • 이때, 원본 저장소의 main 이 변경된 것을 작업 도중 동기화해오려면 아래의 절차를 따름

    동기화 하는 방법은 다음과 같습니다.

    • step1: upstream 이라는 이름으로 원본 원격 저장소 추가하기
    $ git remote add upstream https://github.com/lablup/backend.ai
    
    • step2: 원본 원격저장소의 main 브랜치의 최신 커밋을 코드 복사본(local working copy)으로 가져오기
    $ git fetch upstream
    
    • step3: 원본 원격저장소의 main 브랜치 최신 커밋 반영 내역을 origin(본인이 fork 한 원본 저장소의 코드 복사본(local working copy))로 가져오기
    $ git switch main && git merge --ff upstream/main
    
    • step4: step 1 ~ 3에서 진행된 코드 복사본(local working copy)의 변경 내역을 origin(본인이 fork 한 원본 저장소의 원격 저장소)에 반영하기
    $ git push origin main
    

    이제 upstream/mainorigin/mainmain을 거쳐 동기화된 것입니다.

    • step5: 작업 중인 내 브랜치에 최신 업데이트 반영하기
    $ git switch topic
    $ git merge main
    

    이 과정을 수행할 때 origin/mainupstream/main 간에 history 분기가 생긴 상태에서 5번 절차를 잘못 수행하면 굉장히 복구하기 까다로워질 수 있습니다. 또한, Backend.AI에서 사용하는 CI 도구들이 PR을 테스트할 때 upstream/mainorigin/topic 사이의 차이점을 보기 위해 공통 조상 커밋을 찾게 되어 있는데 topic 브랜치를 main 이름을 재활용하는 경우 그러한 도구들이 제대로 동작하지 않게 됩니다. 가능하면 새로운 분기를 만들 때는 항상 새로운 이름을 붙여준다고 생각하면 됩니다.

    Pull Request 작성 요령

    실제 특정 버그 패치나 기능 구현 사항을 PR로 보내려면 먼저 이를 GitHub에 올려야 합니다. 여러 방법이 있지만, 다음과 같은 방법을 권장합니다:

    • GitHub의 저장소 페이지에서 fork 를 뜹니다. (직접 커밋 권한이 있는 경우라면 fork 없이 바로 브랜치를 만드는 것을 권장합니다.)
    • 코드 복사본(local working copy)에서 git remote로 해당 fork 저장소를 가리키게 합니다.
      • 이때, 관례를 따라 래블업의 원본 저장소를 upstream으로, fork해서 새로 만든 저장소를 origin이라고 이름을 붙이면 좋습니다.
      • fork 후 처음 clone하는 경우가 아니라 install-dev로 설치를 먼저 했던 경우라면 원본 저장소가 origin일 것이므로 remote 이름 변경 작업을 해줘야 합니다.
    • 새 브랜치를 만듭니다.
      • 브랜치 이름은 버그 수정인 경우 fix/를, 기능 추가나 개선인 경우 feature/를 앞에 붙여 kebab-case 방식으로 주제를 요약하여 짓습니다. (예: feature/additional-cluster-env-vars, fix/memory-leak-in-stats) 그 외에 docs/, refactor/ 같은 prefix를 사용하기도 합니다.
      • main 브랜치에 직접 수정하여 PR을 작성하는 것도 가능하지만, PR 리뷰 및 수정 기간 동안 main 브랜치에 추가 변경사항이 생기는 경우 upstream 저장소와 동기화할 때마다 매번 rebase 또는 merge해줘야 하기 때문에 더 귀찮습니다. 별도의 브랜치를 따두면 내가 원할 때 rebase 및 merge 를 할 수 있습니다.
    • 변경사항을 해당 브랜치로 커밋합니다.
      • 커밋 메시지는 가급적 conventional commit 스타일을 따릅니다. 브랜치 이름과 마찬가지로 fix:, feat:, refactor:, docs:, release:와 같은 제목 접두어들을 사용하며, Backend.AI 한정으로 의존성 관련 커밋에는 setup:, gitignore 업데이트나 저장소 디렉토리 구조 변경과 같은 경우에는 repo: 같은 추가 접두어를 사용하기도 합니다. 괄호를 묶어 영향받는 컴포넌트를 표기하기도 합니다. (예: fix(scripts/install-dev): Update for v21.03 release)
      • 커밋 메시지는 영어로 작성해야 합니다.
    • 브랜치를 push하고 PR을 작성합니다.
      • 별도 이슈가 있는 PR의 경우 PR 본문에 해당 이슈 번호를 적어주어야 합니다. 만약, 저장소의 이슈를 참조하려면, 다음의 이슈 링크의 https://github.com/lablup/backend.ai/issues/401 숫자를 보고, #401과 같은 형식으로 적으면 GitHub이 자동 링크를 걸어줍니다.
      • PR 본문에 특정한 형식을 요구하지는 않지만, 어떤 문제를 해결하기 위한 것인지, 어떤 원리로 작성하였는지 혹은 어떤 도구나 라이브러리를 활용하였는지, 그러한 선택을 한 이유는 무엇인지 등을 적어주면 좋습니다.
      • PR 제목 및 본문은 영어 또는 한국어로 작성 가능합니다.
      • PR을 생성하면 다양한 자동화된 검사 도구가 동작하는 것을 볼 수 있습니다. 특히, CLA (contributor license agreement)는 반드시 서명(GitHub 사용자이름 등록)해주셔야만 리뷰가 진행됩니다.
      • 각 언어별 기본 코딩스타일·코딩 규칙 검사를 모두 통과해야 합니다. (Python 코드의 경우 flake8, mypy 등)
      • changes 디렉토리가 존재하고 towncrier 검사가 있는 저장소에서는, PR을 생성하여 그 번호를 받으면 changes/<PR번호>.<수정유형> 이름의 파일을 생성하여 Markdown 문법으로 변경사항 내용 요약을 한 줄의 영어 문장으로 작성합니다. (비교적 간단한 내용이거나 기존 이슈가 따로 있는 경우에는 이 내용이 PR 본문 역할을 대신하기도 합니다.) 수정 유형은 fix, feature, breaking, misc, deprecation, doc이 있으며 프로젝트별로 다른 부분은 각 저장소의 pyproject.toml에 정의됩니다. 기존 메시지들을 어떻게 적었는지는 CHANGELOG.md 또는 CHANGES.md와 같은 파일을 참고하면 됩니다.
    • 리뷰 과정을 진행합니다.
      • 완료되면 보통 squash-merge 형태로 리뷰어가 커밋 로그를 정리하여 하나의 단일 커밋으로 만들어 병합하게 됩니다.
      • 따라서 리뷰 과정에서 자잘한 수정 커밋을 자주 만드는 것에 부담을 가지지 않고 자유롭게 생각날 때마다 커밋을 만들어주시면 됩니다.

    GitHub CLI, SourceTree, GitKraken과 같은 도구들을 git 명령어와 함께 활용하면 더욱 좋습니다.

    정리

    지금까지 Backend.AI의 전체적인 컴포넌트 구조와 저장소 구조, 개발환경 설치 방법, 그리고 pull request 작성 요령을 살펴보았습니다. 이 가이드가 Backend.AI 소스코드에 한 발짝 더 다가갈 수 있도록 도움이 되었으면 좋겠습니다.


    [1]: "editable" 설치란 Python 패키지를 소스 디렉토리를 직접 바라보도록 설치하여 site-packages 디렉토리 내부를 편집하지 않고 소스 디렉토리를 수정하는 것만으로도 해당 패키지를 import 시 변경 내용이 바로 반영되어 있도록 하는 설치 방법을 말합니다.

    10 July 2024

  • aiomonitor-ng: 복잡한 asyncio 애플리케이션을 위한 디버깅 도구

    By 김준기

    프로그램의 복잡도가 올라갈수록 소프트웨어 개발자에게는 좋은 디버깅 도구가 필요합니다. 가장 이상적인 디버깅 과정은 마음껏 실험해볼 수 있는 개발환경에서 문제를 안정적으로 재현하는 방법을 알아내고 이를 자동화된 테스트로 만드는 것이죠. 하지만 재현 시나리오 구성 자체가 너무 복잡하거나 프로덕션 환경에서만 가끔씩 랜덤하게 발생하는 종류의 버그들은 차선책으로 로그를 상세히 남겨서 사후에라도 어떤 문제가 있었는지 파악할 수 있도록 해야 합니다. 이번 글에서는 복잡한 asyncio 프로그램의 디버깅을 쉽게 하기 위해 개발한 aiomonitor-ng 도구를 소개합니다.

    asyncio 애플리케이션 디버깅은 고유한 어려움들이 있습니다. 파이썬에서 디버깅할 때 가장 자주 활용하는 것이 바로 프로그램이 어느 부분을 실행하다가 예외가 발생했는지 보여주는 stack trace입니다. 그런데 asyncio 애플리케이션은 여러 개의 코루틴 작업들이 각자의 스택을 가지고 동시에 엮여서 실행되기 때문에 특정 예외가 발생한 코루틴 작업의 스택뿐만 아니라 '관련된' 코루틴 작업들의 스택도 함께 관찰해야 다른 코루틴 작업으로부터 야기된 오류인지 아닌지를 정확하게 파악할 수 있습니다. 특히, 내 코드에서 사용한 외부 라이브러리가 암묵적으로 코루틴 작업을 생성하고 그 코루틴 작업이 다시 내 코드를 호출하는 상황이라면 더욱 중요한 문제가 됩니다. 게다가 개발환경에서는 잘 발생하지 않고 프로덕션 환경에서만 발생하는 코루틴 작업 폭주 문제나 지속적으로 실행되어야 하는 코루틴 작업이 조용하게 종료되어버린다거나 하는 종류의 버그들은 굉장히 잡기 어렵습니다. 이런 종류의 버그들은 명시적인 예외가 발생하는 것이 아니기 때문에 사후 로그를 통해 문제점을 간접적으로 유추하는 수밖에 없기 때문입니다.

    aiomonitor는 asyncio 코어 개발자들이 개발한 프로덕션용 라이브 디버깅 도구입니다. asyncio 기반 코드를 monitor 객체로 감싸두면, 해당 코드가 실행 중일 때 프로세스 외부에서 미리 설정된 TCP 포트로 텔넷 세션을 열어 간단한 명령어들을 통해 이벤트루프가 실행하고 있는 코루틴 작업들의 목록과 개별 스택 현황을 조회할 수 있게 해줍니다. Backend.AI에는 이미 이 aiomonitor가 적용되어 개별 서비스 프로세스마다 고유의 디버깅용 텔넷 포트가 할당되어 있습니다. (물론 보안 상 이유로 localhost로부터의 접속만 허용합니다.) 이를 통해 프로덕션에서만 발생하는 문제들을 디버깅하는 데 큰 도움을 받을 수 있었죠. 하지만 여전히 Backend.AI 자체의 코드가 아닌 외부 라이브러리에 의해서 발생하는 코루틴 작업 폭주 문제나 조용하게 종료되어버리는 코루틴 작업이 왜 죽는지 디버깅하는 것은 정확히 그 문제가 발생하는 시점을 특정하여 그 순간에 aiomonitor를 들여다보는 방식으로는 디버깅에 한계가 있었습니다.

    그래서 aiomonitor-ng라는 확장 버전을 개발하게 되었습니다. ng는 next-generation의 약자입니다. 크게 다음과 같은 기능들이 추가 및 개선되었습니다.:

    • Task creation tracker: 모든 실행 중인 코루틴 작업에 대해, 각 코루틴 작업을 생성(asyncio.create_task())한 작업들에 대해 그 순간의 stack trace를 모두 보존하여 연속된 작업 생성 체인을 모두 알 수 있도록 하였습니다. (ps, where 명령)
    • Task termination tracker: 최근 종료된 코루틴 작업들을 최대 N개까지 로그를 보존하고 조회할 수 있게 해줍니다. 특히 어떤 한 작업이 다른 작업을 취소(Task.cancel())한 경우, 취소를 트리거한 순간의 stack trace를 함께 보존하여 연속된 취소 체인을 모두 알 수 있도록 하였습니다. (ps-terminated, where-termianted 명령)
    • Persistent task marker: 기본값으로는 메모리 누수를 방지하기 위해 종료된 작업을 최근 N개까지만 추적하지만, 애플리케이션 수명 주기 동안 계속 실행되어야 하는 특정 작업들을 데코레이터로 표시해두면 해당 작업들은 이력 개수 제한과 관계 없이 항상 종료 로그를 보존해주고 종료 로그 조회 명령에서 별도 옵션으로 필터링하는 기능을 제공합니다. (aiomonitor.task.preserve_termination_log 데코레이터)
    • 세련된 terminal UI: 기존에 손으로 짜여진 명령어 파싱을 바탕으로 했던 단순 REPL (read-evaluate-print loop) 구성이었던 명령줄 처리를 개선하였습니다. Clickprompt_toolkit을 활용하도록 aiomonitor 서버측 구현을 재작성하고, 클라이언트도 asyncio로 native하게 동작하는 텔넷 클라이언트를 자체 구현하여 명령어 및 task ID 등의 인자 자동완성을 제공합니다.

    실제 사용 화면은 다음과 같습니다.:

    aiomonitor-ng 도구를 활용하여 grpcio 라이브러리에서 콜백으로 생성하는 코루틴 작업이 과다 생성되어 발생하는 리소스 누수 및 성능 저하 문제, docker 데몬이 발생시키는 이벤트를 모니터링하는 작업이 특정한 메시지 입력 패턴에 의해 조용하게 종료되어 버리는 바람에 컨테이너 생성이나 삭제 작업의 결과가 리턴되지 않아 시스템이 멈추는 문제 등을 성공적으로 디버깅할 수 있었습니다.

    앞으로 aiomonitor-ng를 통해 래블업뿐만 아니라 다양한 Python asyncio 애플리케이션을 개발하는 독자분들께서도 디버깅에 큰 도움을 받기를 바라며 글을 마칩니다.

    aiomonitor-ng는 PyPI를 통해 pip install aiomonitor-ng 명령으로 설치하실 수 있으며, 제 깃헙 계정에 오픈소스로 공개되어 있으므로 누구나 사용 및 기여가 가능합니다.

    28 November 2022

도움이 필요하신가요?

내용을 작성해 주시면 곧 연락 드리겠습니다.

문의하기

Headquarter & HPC Lab

서울특별시 강남구 선릉로100길 34 남영빌딩 4층, 5층

© Lablup Inc. All rights reserved.