태그 : Event

  • 래블업의 파이콘 한국 2024 후기: lambda submit: Starbucks if submit == "duck" else None

    By 허진호

    안녕하세요, 래블업에서 Technical Writer로 일하고 있는 허진호입니다. 저희 래블업은 지난 10월 26일부터 10월 27일까지 수원 컨벤션센터에서 개최된 파이콘 한국 2024에 플래티넘 스폰서로 참여했습니다.

    래블업의 창업 이념은 오픈소스와 큰 연관이 있습니다. 래블업의 피에는 오픈소스가 흐르고 있다고 해도 과언이 아니죠. 다양한 오픈소스들이 있지만, 그중에서 래블업은 특히나 파이썬과 인연이 깊습니다. 래블업은 asyncio를 이용하여 개발된 aiohttp와 같은 오픈소스에도 적극적으로 기여하고 있고, 파이썬 그 자체에도 기여하고 있습니다. 파이썬뿐만이 아니라 파이콘과도 인연이 깊죠. 래블업의 구성원들은 그동안 전세계 파이콘에서 다양한 주제의 발표를 해 왔고, 파이콘 한국에는 총 다섯 번 후원사로 참여하며 그 인연을 이어오고 있습니다.

    이번 파이콘은 래블업에게도 뜻깊은 행사였습니다. 래블업의 신정규 대표와 김준기 CTO가 파이콘 양일 기조연설자로 나섰기 때문인데요, 신정규 대표는 'Python과 PyCon과 공룡시대와 닭들의 행성'이라는 주제로 발표를 진행했습니다. 언뜻 보면 혼란스러운 제목이지만, 진화에서 1차적으로 승리했던 공룡에 두 가지 파이썬의 성질을 비유한 것입니다. 하나는 파이썬의 급격한 성장과 1위 언어로의 등극, 그리고 엄청난 연산으로 혁신을 만들어내는 대 AI 시대의 핵심 언어라는 성질입니다. 이는 현대에서 가장 많이 소비되는 육류인 '닭'으로 연결되는데요, 특유의 접근성과 범용성으로 누구나 쉽게 배운 후에 활용할 수 있는 성질이 닭과도 같다는 뜻이었다고 하네요. 특유의 재치있는 제목과 말솜씨, 다양한 AI 생성 그림으로 청중을 휘어잡은 신정규 대표의 발표는 청중의 많은 호응을 받았습니다.

    김준기 CTO는 '파이콘과 나의 10년 돌아보기'라는 주제로 발표를 진행했습니다. 총 4개의 챕터로 구성된 이번 발표는 세계 각지에서 파이콘과 함께했던 발표를 돌아보며 asyncio와 함께 했던 성장으로 시작해 확장되는 회사의 규모, 그리고 코드의 확장에 대응해나가는 과정, 어떻게 하면 다른 파이써니스타들에게 영감을 줄 수 있을지에 대해 다뤘습니다. 개발자라면 마주했던, 혹은 마주할 수 있는 문제를 쉽게 풀어내 대중의 많은 박수를 받았습니다.

    래블업 조규진 선임 소프트웨어 엔지니어, 세르게이 렉시코브 리서처, 김준기 CTO

    또한 조규진 래블업 선임 소프트웨어 엔지니어와 세르게이 렉시코브 리서처, 김준기 CTO가 각각 세션 발표를 진행했는데요, 조규진 선임 소프트웨어 엔지니어는 '자동화된 파이썬 웹 프레임워크 API Schema 제작기: The long way around'를 주제로 aiohttp를 사용하며 겪었던 API 문서 자동 생성의 어려움을 극복하기 위해 거쳤던 일련의 삽질기를 청중과 공유했습니다. 세르게이 렉시코브 리서처는 'Automating CLI commands execution with LLM and LangGraph: A new frontier in Python automation'이라는 주제로, 복잡한 CLI를 LLM과 LangGraph 프레임워크를 사용하여 사용자 친화적인 도구로 변환하여 사용자 경험과 운영 효율성을 향상시키는 방법에 대해 발표했습니다. 두 발표 모두 많은 청중을 모으며 뜨거운 관심을 받았습니다. 김준기 CTO 역시 세션 발표를 통해 '엔터프라이즈 공급을 위한 파이썬 엔지니어링'이라는 주제로 파이썬 앱 공급을 위한 패키징/인스톨러 개발 사례를 나눴습니다.

    👨‍🏫 허진호: 파이콘 세션 발표 후기가 궁금합니다.

    👨‍💻 세르게이 렉시코브: 발표를 영어로 진행했음에도 파이콘 한국 측에서 실시간 통번역 시스템을 지원해주었기 때문에 문제 없이 발표를 마칠 수 있었습니다. 세션이 끝나고 나서 몇몇 열성적인 청중들이 다가와 발표 주제에 대한 질문을 했던 점이 가장 기억에 남습니다.

    'AI 그림 판독기' 이벤트 (오리와 백조 그리기)

    래블업은 이번 파이콘 한국 2024의 부스 이벤트로 'AI 그림 판독기' 이벤트를 개최했습니다. 파이콘 한국 2024에 참여한 참가자들은 QR코드를 통해 개개인의 휴대전화 혹은 태블릿, 노트북에서 이벤트 페이지에 접속해 '오리와 백조'를 그려 경품에 도전할 수 있었습니다. 참여만 해도 래블업 폴딩 파우치를 받을 수 있었고, 종합 1등을 한 참가자는 스타벅스 기프트카드를 받아갈 수 있는 아주 멋진 이벤트였죠.

    래블업이 행사마다 들고 다니는 스티커

    왜 하필 오리와 백조냐고요? 저희가 행사에 항상 가져다니는 스티커에는 귀여운 오리와 백조가 그려져 있습니다. 이 친구들은 물 위에서는 도도하게 떠 있지만, 수면 밑에서는 물위에 떠 있기 위해 열심히 발을 휘젓고 있는 것으로 알려져 있는데요, 우리 스티커 역시 고객이 도도하게 수면 위에서 AI 서비스를 하는 동안 Backend.AI가 그 밑의 일을 담당하겠다는 비유적인 의미를 가지고 있죠.

    이벤트의 내용은 간단합니다. 텍스트를 입력하면 그림을 생성해 주는 생성형 AI를 이용하여, 주어진 그림과 가장 가까운 그림을 그려내는 이벤트죠. 아마 Stable Diffusion이나 Dall-E 같은 생성형 AI 솔루션을 이용해 그림을 그려본 분들이라면 아시는 내용이겠지만, 생성형 AI는 입력에 따라 출력이 결정되는 매우 민감한 구조를 가지고 있습니다. 같은 입력값을 활용해도 매 번 출력값이 달라지기도 하고, 약간만 입력을 변형해도 전혀 다른 결과가 나오기도 하죠. 이처럼 원하는 결과물을 생성해내기 위해 생성형 AI를 가르치는 (안내하는) 과정을 우리는 '프롬프트 엔지니어링'이라고 부릅니다. 저희 부스에서 이벤트를 참여하신 모든 분들은 '나만의 작은 프롬프트 엔지니어링' 과정을 체험해 보신 셈입니다.

    우리의 'AI 그림 판독기' 이벤트 백엔드 개발을 담당했던 조규진 선임 소프트웨어 엔지니어에게 개략적인 설명을 부탁드렸습니다.

    👨‍🏫 허진호: 'AI 그림 판독기' 이벤트 페이지가 어떻게 만들어졌는지 설명 부탁드립니다.

    👨‍💻 조규진: 'AI 그림 판독기' 이벤트 페이지 백엔드는 총 세 가지의 마이크로서비스로 구성되었습니다. 첫 번째는 WAS (Web Application Server), 두 번째는 이미지 생성 파이프라인, 세 번째는 이미지 유사도 판별 파이프라인입니다. WAS는 사용자 데이터베이스와 이미지 생성 요청 처리 API로 구성되어 있습니다. 이 모든 마이크로서비스는 Backend.AI에서 'Model Service' 기능을 통해 배포되었습니다. 저희 리서치 팀의 세르게이님이 만드신 Visutale 데모처럼, 저희 Backend.AI에서 AI 서비스 개발의 모든 것이 가능하다는 데모의 성격으로 봐 주셔도 좋을 것 같습니다.

    👨‍🏫 허진호: 구체적으로 어떤 프로세스를 통해 사용자의 그림과 주어진 그림과 유사도가 나오게 되는 것인가요?

    👨‍💻 조규진: 사용자가 QR 코드를 통해 접속한 페이지에서 프롬프트를 입력, 이미지 생성을 요청하면 WAS가 이미지 생성 서비스에 텍스트를 전달하고, 생성된 이미지를 반환받습니다. WAS는 생성된 이미지를 다시 유사도 판별기에 전달하고, 유사도 판별기로부터 퍼센트로 계산된 유사도를 돌려받아 사용자에게 생성된 그림과 함께 전달합니다.

    👨‍🏫 허진호: 어떤 기준으로 그림을 그려야 높은 점수를 받을 수 있나요?

    👨‍💻 조규진: 이미지 유사도 판별 파이프라인이 무슨 기준으로 유사도를 판별하는지는 저도 알 수 없습니다. 아마 AI에게 직접 물어보는 것이 답변을 얻는 더 좋은 길일지도 모릅니다.

    어마어마한 참여도

    사실 모든 서비스를 만들어낸 당사자들이 그렇듯이 저희 구성원들은 이 이벤트를 '소소한 이벤트'라고 생각했습니다. 그러나 그 생각이 깨지는 데는 한 시간이 채 걸리지 않았습니다.

    래블업 부스에는 사람들이 몰리기 시작했고, 부스 앞에는 본인의 순위를 확인하고 상위권을 사수하기 위한 사람들이 리더보드를 목빠져라 쳐다보고 있는 진풍경이 연출되었습니다.

    심지어 라운지에 앉아 있는 사람들이 휴대전화 화면을 뚫어져라 쳐다보며 백조를 그리고 있었다는 증언도 있었죠.

    통계를 살펴볼까요?

    10월 26일, 27일 양일간 이벤트에 참가하신 분은 총 428분이었습니다. 해당 기간 제출된 이미지 생성 요청은 '11639'건에 달했습니다. 이 중에서 한 사람이 제출한 최대 응답은 1000여건을 훌쩍 뛰어넘어 모두를 경악하게 했답니다. (비밀은 뒤에...)

    의도치 않은 부작용도...

    부스에 앉아 리더보드를 살펴보고 있는 와중에 익숙한 두 개의 닉네임이 눈에 띄었습니다. 'cloudshin' 과 'achimnol' 각각 신정규 대표와 김준기 CTO가 갑자기 불이 붙어서 90% 이상의 유사도 점수를 내고 계신 겁니다. 두 분은 점심을 드시러 이동하는 와중에도 계속해서 끝없이 오리를 그려내고 계셨답니다.

    보다못한 유우영 DevRel Lead님이 이를 말리고 나섰으나, 두 사람의 열정은 쉽게 말릴 수 없었다는 후문이 전해집니다. (P.S.1: 물론 점수를 집계할 때 두 분의 데이터는 강제로 지웠답니다.) (P.S.2: 사실 참가자 분들이 워낙에 훌륭하셔서 이 두 분의 점수를 손쉽게 넘어서는 압도적인 포디움을 만들어 내셨답니다...)

    내부적인 부작용(?) 이외에 외부에서의 문제도 발생했습니다. 1일차 부스를 운영하던 중, 어디선가 개발자의 외마디 비명이 들립니다.

    "누가 매크로를 돌리고 있는 것 같은데요?"

    확인해보니 1~5초 간격으로 계속해서 동일한 프롬프트로의 중복 제출 요청이 들어오고 있었습니다. 같은 프롬프트를 넣어도 매 번 결과물이 조금씩 달라지는 생성형 AI의 특징을 이용한 매크로였죠. 그러나 문제가 식별된 당시에 서비스를 수정하기는 어려웠고, 백엔드를 담당한 개발자는 2일차 파이콘 발표가 예정되어 있었기에 즉각 대응이 어려웠죠. 상황은 점점 나빠져만 갔습니다.

    "제출이 안돼요" "버튼이 안 눌려요" "이미지가 대신 회색 빈 칸만 나와요"

    개발자들의 축제인 파이콘답게, 누군가는 노트북으로 우리 사이트를 열고, 개발자도구를 보여주며 요청이 들어가고 있지 않은 것 같다고 이야기해주기까지 했습니다. 발표준비를 하러 구석에 숨어있는 개발자를 찾아갔고, 아까의 매크로가 우리의 H100을 향해 엄청난 양의 리퀘스트를 쏟아내고 있었습니다. 그렇게 매우 느린 속도로 이미지를 제출하고 있는 사람들을 뒤로 하고 1일차 행사가 끝났습니다. 부스를 정리하며 1일차 Recap을 진행했고, 2일차 행사에는 이런 문제를 원천적으로 막아야 한다는 결론이 도출되었습니다.

    불쌍한 개발자는 2일차 행사를 위해 밤을 새워가며 발표 준비도 미루고 두 가지의 새로운 기능을 추가해 이런 사태를 미연에 방지하고자 했답니다.

    첫째, 동일 프롬프트 제출 방지 기능 추가

    서버단에서 제출한 프롬프트를 검증하는 기능을 추가했습니다. 동일한 프롬프트가 제출된 이력이 있는 경우, 새로운 이미지를 그리지 않고 최초 생성된 이미지와 해당 이미지의 유사도 점수를 그대로 응답하도록 변경했습니다.

    둘째, 이미지 제출 시 캡챠 추가

    매크로를 방지하기 위해 응답 제출 시 캡챠를 누르도록 변경했습니다. 참가자들이 약간 더 귀찮아지긴 했겠지만, 캡챠를 추가한 것으로 행사 2일차에는 무작위 매크로가 발생하지 않았답니다.

    그 외 소소한 개선 사항들

    참여자의 등수 계산을 위해 꽤 자세한 소숫점 단위까지 받아오고 있었지만, 사용자 편의상 GUI상에서는 소숫점 첫째 자리에서 잘라 보여주고 있었습니다. 그러나 경쟁이 과열되며 소수점 첫째 자리까지 똑같은 점수를 받은 사람들이 나타나기 시작했죠. 이에 따라 사용자들의 혼란을 줄이기 위해 소숫점 둘째 자리까지 GUI상에 보여주는 패치를 진행하기도 했습니다.

    성공적인 이벤트를 위해 불철주야 백엔드를 담당해준 조규진 선임 엔지니어와 김수진 프론트엔드 엔지니어에게 감사의 말씀을 전합니다 🙂

    파이콘 한국 2024를 마무리하며

    수많은 파이써니스타 분들이 파이콘 한국 2024를 찾아주셨고, 래블업도 수많은 파이써니스타 분들을 만나러 현장에 함께했습니다. 래블업은 앞으로도 끊임없이 오픈소스 커뮤니티에 기여하고, 함께 성장해나갈 것입니다. 최근에 큰 인기를 끌었던 <흑백요리사>라는 프로그램에서 정지선 셰프가 이런 말을 합니다. "저는 레시피를 오픈해요. 레시피를 오픈하면 그만큼 레시피가 또 생겨요. 사람들이 아이디어를 많이 제공하거든요. 큰 그림을 그리는 거죠."

    래블업도 언제나 우리를 이루고 있는 근간인 오픈소스 정신을 잊지 않고 계속해서 큰 그림을 그려나가겠습니다.

    20 November 2024

  • 2024 GTC 이벤트 실시간 랭킹: GraphQL Subscription 활용법

    By 김수진

    래블업은 2024년 GTC 이벤트를 기념하여 특별한 이벤트를 개최했다. 참가자들은 래블업이 제공한 LLM 모델을 이용하여 주어진 이미지와 유사한 이미지를 생성했고, 높은 점수를 받은 참가자 중에서 추첨을 통해 무려 NVIDIA RTX 4090 그래픽 카드를 증정했다. 🫢
    이번 포스트에서는 이벤트 페이지 중 참가자들의 점수를 실시간으로 확인할 수 있게 해주는 리더 보드 페이지에 사용된 GraphQL의 subscription 기능에 대해 알아보고자 한다.

    GTC24 이벤트 페이지

    Subscription 이란?

    클라이언트가 서버 측 이벤트 스트림으로부터 데이터를 구독하는 메커니즘이다.

    데이터가 실시간으로 바뀌는 경우, 예를 들어 실시간 로그나 채팅 어플리케이션 등을 구현할 때, 서버에서 업데이트를 푸시해주면 바로 반영할 수 있다.

    subscription은 필요한 정보가 서버에서 변경될 때만 데이터를 보내준다. 따라서 데이터 변경이 빈번하지 않은 경우, subscription은 데이터 트래픽을 줄이고, 이에 따른 비용 절감 효과도 있을 수 있다.

    비슷한 개념으로 GraphQL 의 network-only fetchPolicy 옵션을 주고 Query 를 요청해서 매번 최신 정보를 가져올수 있지만 subscription과 차이가 있다. Query 는 클라이언트가 데이터를 필요로 할 때마다 항상 서버에 요청하며 항상 최신 데이터를 보장하지만, 각 요청에 대한 네트워크 비용을 수반한다. 그래서 어떤 버튼을 클릭했을 때 항상 최신의 결과를 보여주도록 보장하기 위해 fetchPolic 를 network-only 로 설정하는 것은 괜찮지만, 주식 거래 창과 같이 업데이트가 빈번한 데이터를 가져오기 위해 query를 사용한다면 네트워크 비용이 상당해진다.

    결론적으로, 목표 응용 프로그램의 요구 사항, 사용자 수, 데이터의 업데이트 빈도 등에 따라 subscription 을 사용할지, query 를 사용할지 결정해야 한다.

    사용 방법

    subscription 정의하기

    사용 방법은 query 와 유사한데, 키워드만 subscription 을 사용해주면 된다.

      const leaderboardSubscriptions = graphql`
        subscription Ranking_leaderboardSubscription {
          leaderboard {
            submissions {
              id
              name
              score
              imageUrl
            }
            lastUpdatedAt
          }
        }
      `;
    

    leaderboard 스트림에서 이벤트가 발생할 때마다 애플리케이션에 알림이 전송되고, 클라이언트에서는 업데이트된 결과를 얻을 수 있다.

    그럼 다음과 같은 결과를 얻을 수 있다.

    leaderboard: {
    	submissions: [
    		{
        	"id": "76293167-e369-4610-b7ac-4c0f6aa8f699",
    	    "name": "test",
        	"score": 0.5910864472389221,
    	    "imageUrl": "<IMAGE_URL>"
    		},
        ],
    	lastUpdatedAt: 1710176566.493705
    }
    

    subscribe

    실시간 랭킹을 보여주기 위해 해당 페이지에 들어갈 때 subscribe 를 호출하고, 다른 페이지로 넘어갈 경우, dispose 를 호출하여 unsubscribe 하기 위해 useEffect를 사용했다.

    import { useEffect } from 'react';
    import { requestSubscription } from 'react-relay';
    
    useEffect(() => {
      const subscriptionConfig = {
        subscription: leaderboardSubscriptions,
        variables: {},
        onNext: (response: any) => {
          setLeaderboard(response.leaderboard.submissions); // 미리 정의된 state
        },
        onError: (error: any) => {
          console.error('Leaderboard subscription error', error);
        },
      };
      const { dispose } = requestSubscription(
        RelayEnvironment, // 아래 '설정 방법' 참고
        subscriptionConfig,
      );
      return () => {
        dispose();
      };
    }, []); // 빈 의존성 배열을 통해 컴포넌트가 마운트되거나 언마운트될 때만 이 부분이 실행되도록 함
    

    requestSubscription

    • 메소드는 반환 값으로 Disposable 오브젝트를 제공한다.
    • Disposable 오브젝트에는 구독을 취소하는 dispose 메서드가 포함되어 있다.

    onNext

    • subscription으로 데이터가 업데이트되면, 미리 정의해두었던 state 를 업데이트하여 실시간 랭킹을 보여주도록 하였다.
    • onNext, onError 외에도, subscription 이 끝날 때 호출되는 onCompleted, 서버 응답을 기반으로 메모리 내 릴레이 저장소를 업데이트를 위한 updater 등 다양한 설정들이 있다. 자세한 설명은 이 링크를 참고하길 바란다.

    dispose

    • useEffect hook 내에서 반환하는 cleanup 함수를 통해 컴포넌트가 언마운트될 때 dispose 메소드를 호출하여 구독을 종료하게 된다.

    설정 방법 (+Relay)

    Relay document 에 따르면, GraphQL subscriptions 은 WebSockets 으로 통신하며, graphql-ws를 사용해서 network를 설정하는 방법은 다음과 같다. (subscriptions-transport-ws를 사용하는 방법도 있지만 deprecated 되었으니 패스하기로 한다.)

    import { ExecutionResult, Sink, createClient } from 'graphql-ws';
    import {
      Environment,
      Network,
      RecordSource,
      Store,
      SubscribeFunction,
      RelayFeatureFlags,
      FetchFunction,
      Observable,
      GraphQLResponse,
    } from 'relay-runtime';
    import { RelayObservable } from 'relay-runtime/lib/network/RelayObservable';
    import { createClient } from 'graphql-ws';
    
    const wsClient = createClient({
      url: GRAPHQL_SUBSCRIPTION_ENDPOINT,
      connectionParams: () => {
        return {
          mode: 'cors',
          credentials: 'include',
        };
      },
    });
    
    const subscribeFn: SubscribeFunction = (operation, variables) => {
      return Observable.create((sink: Sink<ExecutionResult<GraphQLResponse>>) => {
        if (!operation.text) {
          return sink.error(new Error('Operation text cannot be empty'));
        }
        return wsClient.subscribe(
          {
            operationName: operation.name,
            query: operation.text,
            variables,
          },
          sink,
        );
      }) as RelayObservable<GraphQLResponse>;
    };
    
    // Export a singleton instance of Relay Environment
    // configured with our network function:
    export const createRelayEnvironment = () => {
      return new Environment({
        network: Network.create(fetchFn, subscribeFn),
        store: new Store(new RecordSource()),
      });
    };
    
    export const RelayEnvironment = createRelayEnvironment();
    

    wsClient

    • url 에는 GraphQL 서버의 웹소켓 URL 을 입력한다.
    • credentials 설정은 connectionParams를 통해 가능하다.

    subscribeFn

    • Observable의 구독 동작을 정의한다.
    • if (!operation.text) { ... } 에서 쿼리 문자열의 유효성을 확인하여 유효하지 않은 경우, 오류를 발생시키고 실행을 중단한다.
    • 마지막으로 return wsClient.subscribe( ... ) 코드는 웹소켓 클라이언트를 사용하여 실제로 subscription을 구독하고, GraphQL operation의 payload를 sink (즉, Observer) 에게 전달한다.
    • 간단히 말해, 이 함수는 GraphQL subscription 요청을 처리하고, subscription 이벤트가 발생할 때마다 해당 결과를 Observable 스트림에 push하는 역할을 한다고 볼 수 있다.

    createRelayEnvironment

    • 새로운 Relay Environment 를 생성하고 반환한다.
    • Relay의 Environment는 다른 고수준 Relay 객체들과 네트워크 계층, 캐시등을 관리하는 컨테이너이다.
    • GraphQL query/mutation 요청을 처리하는 함수를 fetchFn, subscription 요청을 처리하는 함수를 subscribeFn 에 할당한 상태이다.
    • 캐시 데이터를 저장하고 관리하는 Relay Store를 생성하기 위해 RecordSource 저장소를 사용했다.

    RelayEnvironment

    • createRelayEnvironment 함수를 호출함으로써 RelayEnvironment 를 초기화하고, 이를 추후 다른 곳에서 임포트해 사용할 수 있게 내보내는 역할을 한다.
    • 이렇게 구성된 RelayEnvironment는 주로 QueryRenderer, useLazyLoadQuery, commitMutation 등에서 사용된다.

    CORS 에러

    처음에 GraphQL 서버의 웹소켓 URL을 설정하기 위해 서버측에서 사용하는 config.toml 파일을 읽어와서 주소를 설정했다. 그런데 자꾸 CORS 에러가 나면서 요청 보낼 때마다 Unauthorized 가 뜨는 것이다. 그래서 이것저것 삽질을 한 결과, 동료분의 도움으로 해결할 수 있었다. (정말 감사합니다 🥹🙏)

    해결 방법은 바로 http-proxy-middleware 를 사용해 setupProxy 를 설정하는 것!

    create-react-app manual에서도 알 수 있듯이, 일반적으로 프론트엔드와 백엔드가 분리된 개발 환경에서 CORS 이슈를 방지하기 위한 설정이나, 개발 서버에서 실제 서버의 특정 경로에 대한 요청을 프록시하기 위해 setupProxy 를 설정할 수 있다.

    코드는 다음과 같다.

    const { createProxyMiddleware } = require('http-proxy-middleware');
    
    module.exports = function (app) {
      app.use(
        createProxyMiddleware('/graphql', {
          target: 'http://127.0.0.1:9220',
          changeOrigin: true,
          followRedirects: true,
          ws: true,
        }),
      );
    };
    

    createProxyMiddleware('/graphql', { ... })

    • '/graphql'에서 발생하는 모든 HTTP 요청을 미들웨어가 처리하도록 설정한다.

    target: 'http://127.0.0.1:9220'

    • 프록시 된 요청이 전달될 서버의 주소를 설정한다. 여기선 9220번 포트로 설정했다.

    changeOrigin: true

    • 요청의 호스트 헤더를 target의 호스트로 변경한다. CORS 이슈를 해결하기 위해 사용한다.

    followRedirects: true

    • 이 설정은 서버가 요청에 대해 리다이렉트 응답을 보냈을 때 그 리다이렉트를 프록시가 따르도록 한다.

    ws: true

    • 이 설정은 웹소켓 프록시를 활성화한다. 클라이언트와 서버 간의 웹소켓 연결도 이 프록시를 통해 전달되며, subscribe를 위해 true로 설정하였다.

    리더보드 페이지

    기나긴 삽질 끝에 마침내 완성한 리더보드 페이지! 🎉 참여해 주신 모든 분들께 깊은 감사를 드립니다. 🙇🏻‍♀️

    결론

    GraphQL 의 subscription 을 사용하여 실시간 랭킹 같은 기능을 구현할 수 있었다. CORS 때문에 설정 방법에 애를 먹긴 했지만, 사용 방법은 query 를 쓸 때와 크게 다르지 않아 어렵지 않았다.

    subscription 은 실시간 업데이트효율성이 가장 큰 장점이 아닐까 생각한다. 서버로부터 실시간으로 데이터를 수신하므로 사용자는 항상 최신 상태를 볼 수 있으며, 필요한 데이터가 변경될 때만 업데이트를 받기 때문에, 자주 변경되지 않은 데이터에 대해서는 서버 요청을 최소화할 수 있다.

    하지만 웹소켓 또는 유사한 실시간 프로토콜을 구현해야 하며, 클라이언트와 서버 사이의 연결 상태를 관리하는 로직도 필요하기에 복잡하긴 하다. 이 글에서 다루진 않았지만, subscription 을 위해 서버측에서 추가 작업이 필요하다. 그리고 실시간 연결을 필요로 하기 때문에 그에 따른 서버 자원과 클라이언트의 리소스 소모가 있을 수 있다.

    따라서 어떠한 방법이 비용이나 성능 면에서 더 효율적인지는 애플리케이션의 특성, 데이터의 갱신 빈도, 사용자의 동시 접속자 수 등 여러 요소에 따라 달라질 수 있으니 적절히 판단하여 사용하길 바란다.

    references

    • https://relay.dev/docs/v10.1.3/subscriptions/
    • https://relay.dev/docs/guided-tour/updating-data/graphql-subscriptions/#configuring-the-network-layer
    • https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API
    • https://github.com/enisdenjo/graphql-ws
    • https://github.com/apollographql/subscriptions-transport-ws
    • https://graphql.org/blog/subscriptions-in-graphql-and-relay
    • https://create-react-app.dev/docs/proxying-api-requests-in-development

    28 March 2024

  • NVIDIA GTC 2024에서 만나요! 래블업이 AI 기술의 최전선을 보여드립니다

    By 래블업 주식회사

    안녕하세요, 래블업입니다. 오는 3월 18일부터 21일까지 미국 새너제이에서 열리는 NVIDIA GTC 2024 컨퍼런스에 래블업이 참가합니다. 5년 만에 열리는 이번 대면 행사에서 래블업은 실버 스폰서로서 그 동안 개발해온 최신 AI 기술과 제품을 선보일 예정입니다.

    About GTC 2024

    GTC는 NVIDIA가 주최하는 AI 분야 최대 규모의 기술 컨퍼런스입니다. 30만 명 이상이 온오프라인으로 참여할 것으로 예상되는 이번 행사에서는 NVIDIA CEO Jensen Huang의 기조연설을 비롯해 900여 개의 세션과 300여 개의 전시 부스, 20여 개의 기술 워크숍 등 다양한 프로그램이 마련되어 있습니다. 제너러티브 AI를 포함한 최신 AI 기술 트렌드를 한눈에 파악할 수 있는 최고의 기회가 될 것입니다.

    Lablup at GTC 2024

    래블업은 GTC에서 전시 부스(#1233)를 운영하며, APAC 지역 유일의 NVIDIA DGX-Ready 소프트웨어인 Backend.AI Enterprise 플랫폼을 시연합니다. Backend.AI는 NVIDIA DGX 시스템을 비롯한 GPU 인프라의 성능을 극대화하고 사용성을 개선해주는 AI 인프라 운영 플랫폼입니다.

    또한 래블업의 MLOps 솔루션인 FastTrack도 함께 선보입니다. FastTrack을 통해 생성형 AI 모델의 전체 개발 과정을 간소화하고 자동화할 수 있습니다. 특히 파운데이션 모델을 다양한 산업 분야에 맞춰 자동으로 파인튜닝하고 챗봇 등으로 활용하는 데모도 준비되어 있습니다.

    Sessions at GTC

    래블업은 두 가지 주제로 GTC 세션 발표에도 참여합니다.

    첫 번째 세션에서는 "Idea to Crowd: Manipulating Local LLMs at Scale" 이라는 제목으로, 개인용 GPU부터 대규모 데이터 센터까지 다양한 규모에서 로컬 LLM을 파인튜닝하고 운영하는 기술과 사례를 소개합니다.

    특히 래블업의 GPU 유동화 기술을 활용해 다양한 크기의 거대언어모델(LLM)과 이미지 생성 모델을 함께 멀티 GPU에 효율적으로 적재하는 방법에 대해 심도 있게 다룰 예정입니다. LLM 로딩 후 불가피하게 발생하는 GPU 메모리 낭비를 최소화하고, 모델별 성능 저하와 전체 성능 향상의 trade-off를 분석한 실험 결과도 공유합니다. 이를 통해 온프레미스 환경에서 AI 모델 서빙을 보다 비용 효율적으로 수행하는 방안을 제시할 것입니다.

    두 번째 세션에서는 Personalized Generative AI라는 주제로, 개인용 GPU를 활용해 가정에서도 손쉽게 생성형 AI 모델을 구동하고 개인화하는 방법을 다룹니다. PC나 가정용 서버 등 작은 규모의 하드웨어에서 생성형 AI를 자동으로 운영하고 파인튜닝하는 기술을 소개하고, 이를 통해 개인 맞춤형 AI 비서가 우리 삶에 더욱 밀접하게 스며들 미래를 전망해볼 것입니다.

    곧 만나요!

    짧게나마 래블업이 이번 GTC에서 선보일 기술과 비전을 소개해드렸습니다. 3월 새너제이에서 열리는 GTC 2024에 참석하시는 분들께서는 래블업 부스(#1233) 에 꼭 들러주시기 바랍니다. 최신 AI 기술을 직접 체험하고 래블업 팀과 직접 소통하실 수 있습니다.

    온라인으로 참여하시는 분들도 래블업 세션 발표를 통해 로컬 LLM과 개인화된 생성형 AI의 현재와 미래를 만나보실 수 있을 것입니다. 래블업은 앞으로도 AI 기술의 최전선에서 기업과 개인이 AI를 보다 쉽게 활용할 수 있도록 노력하겠습니다. 감사합니다!

    15 March 2024

  • 2023 Lablup DevOps Summer 회고

    By 이규봉

    이번 포스팅에서는 래블업에서 지난 9개월 동안 개발자로 경험한 이야기를 다뤄보았다.

    Table of Contents

    • 지원 동기
    • 인턴에서 DevOps로!
    • rraft-py 개발
    • 오픈소스 컨트리뷰션 아카데미 지역 스프린트 Backend.AI 멘토링
    • 다양한 컨퍼런스 참여
    • 2023 오픈소스 컨트리뷰션 아카데미
    • 파이콘 발표
    • 결론

    지원 동기

    개인적으로 래블업에 입사하기 전부터 취미로든, 업무 시간에서든 내가 개발한 프로그램을 통해 다른 사람들에게 도움을 주는 일을 지속적으로 할 수 있는 직업을 갖고 싶다는 생각을 해 왔다.

    특히 오픈 소스는 내가 작성한 코드가 다른 사람들에게 도움을 줄 수 있을 뿐 아니라, 원하는 사람이 있다면 코드를 자유롭게 수정하고 활용할 수 있다는 점에서 더욱 더 매력적으로 느껴졌다.

    졸업 프로젝트로 Arvis라는 개인 프로젝트를 진행해보고 나서야 깨달은 사실 중 하나는, 프로젝트 규모가 계속 커지면서 단순히 내가 좋아하는 일이라는 이유로 프로젝트를 지속하는 것이 현실적으로 쉽지 않다는 점이었다. 나름대로 초기부터 프로젝트를 신중하게 계획하고 진행해 보았지만, 결론적으로 프로젝트 유지에 필요한 시간과 노력을 간과한 것 같다는 생각이 들었다.

    그런 점에서 오픈 소스 관련 활동들을 적극적으로 권장하고 지원해주며, 심지어 소스 코드의 핵심 부분을 오픈 소스로 개발하는 래블업은 내가 꿈꾸던 회사였다.

    인턴에서 DevOps로!

    필자의 래블업 OSSCA 인턴십에서 마지막 3주차 동안 했었던 일은 분산 시스템 관련된 공부 및 조사였다. 특히 Raft 알고리즘 구현에 관련된 내용이 대부분이었다. 직무 이름은 인턴에서 DevOps로 변경되었지만 인턴십에서 맡았던 이슈를 해결하기 위해 계속 Raft 등 인턴십 때 공부했던 내용들을 확장한다는 느낌으로 진행하게 되었다.

    물론 이외에도 아래에서 언급할 다양한 활동 들에도 참여했지만, 현재까지 회사에서한 작업들 중 가장 주된 작업은 rraft-py 작성 등 기존 분산 락으로 작성되어 있는 구조를 대체하기 위해 Raft 알고리즘 구현체의 파이썬 바인딩을 작성하고, Backend.AI와 어떻게 통합시킬 수 있을지에 대해 고민하는 것이었다.

    rraft-py 개발

    rraft-py는 tikv/raft-rs의 파이썬 바인딩 구현체로, 이에 대한 자세한 내용은 GitHub Readme / Wiki를 참고하면 된다. 또한 다음 달 2023 파이콘 KR 발표에서 해당 주제의 기술적인 세부사항들을 발표할 예정이므로 관심이 있다면 참고하면 좋을 것 같다.

    여기선 rraft-py를 개발하면서 배운 기술적인 내용들은 일단 차치하고 Lablup 개발자로서의 경험에 초점을 맞춰 보려고 한다.

    rraft-py는 단순히 Backend.AI의 한 이슈를 해결하는 것 뿐 아니라, 별개의 프로젝트를 만들고 그 프로젝트를 Backend.AI와 통합시키기 위한 프로젝트까지 진행해야 했기 때문에 많은 고민을 하며 진행했다.

    전체적으로 프로젝트에 몇 가지 마일 스톤들이 있었는데 매 마일 스톤을 통과할 때 마다 좀 더 안정된 느낌으로 프로젝트를 진행할 수 있었던 것 같다. 분명히 매번 높은 성취감이 있었지만 나중에 가서야 처음 작성했던 코드가 의도한 대로 돌지 않는다는 것을 확인하고 좌절할 때도 많았다. 하지만 래블업에서 이런 삽질들을 할 수 있는 시간을 허용해줬고, 이전에 그냥 "삽질이었네" 하고 치부하고 넘어가면서 배운 것들을 통해 비로소 지금까지 올 수 있었다고 생각한다.

    rraft-py 예제 코드 실행 결과

    rraft-py를 Backend.AI에 통합하기 위해선 아직도 가야할 길이 더 남아 있지만, 결론적으로 느낀 것은 스스로 생각하고 판단하면서 프로젝트를 계속 고도화 시켜보는 경험을 할 수 있어서 좋았고, 이런 부류의 경험을 좋아하는 개발자들에게 래블업은 최고의 선택지 중 하나가 될 수 있을 것이라는 점이다.

    오픈소스 컨트리뷰션 아카데미 지역 스프린트 Backend.AI 멘토링

    예상했던 것 보다 많은 시간을 요구했기 때문에 rraft-py 개발을 가장 메인으로 진행했지만, 이것 외에도 다양한 성격의 업무를 진행해 볼 수 있는 기회가 있었다.

    그 중 가장 인상 깊었던 업무중 하나가 바로 제 1회 대구 오픈 소스 컨트리뷰션 아카데미 지역 스프린트에 Backend.AI 멘토로 참여해 본 경험이었다.

    사실 Backend.AI에 대한 깊은 이해 없이 멘토로 참여하게 되었는데, 설상가상으로 스프린트 기간도 고작 2일 밖에 주어지지 않아 여러모로 많은 걱정을 갖고 참여했었다.

    멘티 분들이 하나라도 배우고 최대한 만족하고 돌아 가실 수 있도록 하기 위해 Backend.AI를 전혀 모르는 분들에게 어떤 식으로 설명 해 드릴지, 다른 플랫폼에서 어떻게 개발 환경을 구축해야 하는지 등 (개인적으로 평소엔 macOS + docker desktop 환경에서만 개발했었는데, 멘티 분들은 Windows 환경에서 진행하시는 분도 있으셔서 개발 환경 구축하는 과정에서 삽질 하기도 했다.) 여러 가지들을 생각해보고 준비해보아야 했다.

    결론적으로 이런 과정들에 익숙하지 못했던 내가 오히려 더 많은 것들을 배울 수 있었고, 멘티 분들도 생각보다 워낙 잘 따라와 주셔서 다들 한 개 이상씩 PR들을 만드실 수 있었던 뜻 깊은 시간이 된 것 같아 좋았다.

    제 1회 대구 오픈 소스 컨트리뷰션 아카데미 지역 스프린트

    다양한 컨퍼런스 참여

    AI Expo, AWS Summit, Next Rise 등 아래와 같은 다양한 컨퍼런스, 전시회들에 부스로 참여해 볼 수 있었다. 이런 곳들에 참여하면서 Backend.AI를 여러 부류의 사람들에게 설명하는 법을 배울 수 있었던 것도 좋았고, 다른 회사들의 다앙한 기술들을 직접 접할 수 있었던 점도 매력적이었다.

    AI EXPO KOREA 2023

    2023 오픈소스 컨트리뷰션 아카데미

    래블업은 오픈 소스 문화를 지향하는 회사 답게 매년 오픈소스 컨트리뷰션 아카데미에 적극적으로 참여하고 있다. 올해에도 오픈소스 컨트리뷰션 아카데미에 참여했는데, Backend.AI 팀 외에도 다른 다양한 프로젝트들에 참여할 수 있게 장려하고 있어서 필자는 GlueSQL 멘티로 참여해 진행해 보고 있다.

    이런 자유로운 문화는 성장하고 싶어 하는 욕구가 강한 개발자들에게 상당히 매력적인 포인트가 될 것이라 생각한다.

    (필자 외에도 2023 컨트리뷰션 아카데미 다른 프로젝트들에 두 명이나 더 참여하고 있다.)

    파이콘 발표

    회사에서의 rraft-py 개발 경험을 토대로 2023 파이콘 KR에서 발표해 볼 수 있는 기회를 얻을 수도 있었다.

    개인적으로 대외 발표가 처음이라서 다소 얼떨떨한 느낌이지만 나름대로 최선을 다해 준비해보고 있다. 발표에 관심을 가지는 분들에게 발표 자료 뿐만 아니라 GitHub을 통해 소스 코드나 작업 내역까지 모두 공유할 수 있다는 점이 기대된다.

    결론

    래블업은 오픈 소스 문화를 지향하는 회사로, 오픈 소스 컨트리뷰션 아카데미나 파이콘 등 다양한 오픈 소스, 커뮤니티 관련 행사들에 참여할 수 있도록 장려하며 개발자에게 주도적으로 작업을 진행해 보게 하는 기회를 제공한다.

    래블업에서 앞으로 더 꾸준히 다양한 성격의 오픈 소스 활동들에 참여하고, 배우고 성장하며, 기여해보고 싶다.

    18 July 2023

도움이 필요하신가요?

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

문의하기

본사 및 HPC 연구소

서울특별시 강남구 선릉로 577 CR타워 8층

© Lablup Inc. All rights reserved.