ML in a Box: Analyzing Containerization Practices in Open Source ML Projects
이 논문은 1,993개의 오픈 소스 ML Dockerfile을 대상으로 한 최초의 대규모 실증적 연구를 제시하며, 컨테이너가 ML 워크플로에서 뚜렷한 역할을 수행함에도 불구하고 실험으로 인해 빈번하게 발생하는 재빌드로 인해 종종 크기가 크고 비효율적이라는 점을 밝히고, 빌드 효율성을 개선하고 크기를 줄이기 위한 7가지 특정 리팩토링 패턴을 식별하였다.
원본 논문은 CC0 1.0 (http://creativecommons.org/publicdomain/zero/1.0/)에 따라 공공 도메인에 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
당신이 거대하고 첨단 기술이 집약된 주방을 운영하는 셰프라고 상상해 보세요. 머신러닝(ML)의 세계에서 당신의 "레시피"는 코드이고, "재료"는 데이터와 모델이며, 당신의 "주방"은 컨테이너입니다. 컨테이너는 특정 요리를 만드는 데 필요한 모든 것을 담고 있는 자급자족형 휴대용 주방 박스와 같습니다. 덕분에 뉴욕, 도쿄, 혹은 우주선 위에서도 똑같은 맛을 낼 수 있도록 보장해 줍니다.
오랫동안 사람들은 이 주방 박스들이 유용하다는 것은 알고 있었습니다. 하지만 그 박스가 얼마나 큰지, 포장하는 데 시간이 얼마나 걸리는지, 혹은 향신료 병 하나를 바꿨다고 해서 셰프가 박스 전체를 통째로 버리고 처음부터 다시 시작해야 하는 일이 얼마나 자주 발생하는지는 아무도 알지 못했습니다.
한 연구팀은 무엇이 실제로 일어나고 있는지 살펴보기 위해 392개의 서로 다른 프로젝트에서 추출한 1,993개의 ML 주방 박스를 들여다보기로 했습니다. 그들이 발견한 내용을 현실이라는 곁들임 요리와 함께 차려냅니다.
"주방 박스"의 크기: 이건 정말 큰 문제입니다
먼저, 그들은 박스의 무게를 쟀습니다. 당신은 컨테이너가 가볍고 민첩할 것이라고 생각할 수도 있지만, 이 ML 박스들은 거인입니다.
- 평균적으로 컨테이너의 무게는 10.27 GB입니다. 이는 샌드위치를 만들기 위해 배낭에 백과사전 한 도서관 분량을 통째로 넣고 다니는 것과 같습니다.
- "학습(Training)" 박스(AI가 배우는 곳)가 가장 무거우며, 평균 17.25 GB에 달합니다. 어떤 괴물 같은 녀석들은 125 GB까지 치솟기도 합니다!
- "추론(Inference)" 박스(AI가 단순히 작업만 수행하는 곳)는 약 1.72 GB로 더 작지만, 그렇다고 해서 결코 주머니에 쏙 들어갈 크기는 아닙니다.
그리고 이 박스들을 포장하는 일요? 시간도 걸립니다. 평균적인 "콜드 빌드(Cold Build, 처음부터 박스를 포장하는 것)"는 8.84분이 소요됩니다. 큰 학습용 박스의 경우 14분 이상 걸릴 수도 있습니다. 코드가 제대로 작동하는지 확인하려고 기다리기에는 너무 긴 시간이죠.
"앗!" 하는 순간: 왜 박스를 버리게 되는가
일반적인 주방에서는 레시피를 변경하면 그냥 지침을 수정하면 됩니다. 하지만 ML의 세계에서는 주방이 엄격한 "레이어(층)" 시스템으로 작동합니다. 블록 쌓기를 상상해 보세요. 만약 당신이 세 번째 블록의 색깔을 바꾼다면, 네 번째, 다섯 번째, 그리고 맨 꼭대기에 있는 블록까지 모두 해체해야 합니다. 설령 맨 위의 블록들이 전혀 변하지 않았더라도 말이죠.
연구진은 개발자들이 프로젝트에 가한 모든 변경 사항 중 **44.4%**가 컨테이너의 전체 재빌드를 유발한다는 사실을 발견했습니다. 즉, 거의 절반의 시간 동안 그들은 공든 탑을 허물고 처음부터 다시 시작하고 있었던 것입니다.
무엇이 이 '버리기'를 유발했을까요?
보통은 레시피(Dockerfile) 자체 때문이 아니었습니다. 바로 재료 때문이었습니다!
- 재 rebuild(재빌드)의 **96.4%**는 누군가 박스 내부로 복사된 파일(데이터셋이나 코드 파일 등)을 변경했기 때문에 발생했습니다.
- 박스를 만드는 실제 지침(Dockerfile)을 변경해서 발생한 재빌드는 단 **1.1%**뿐이었습니다.
낭비: 작업의 70%가 헛수고입니다
이것이 이 이야기에서 가장 슬픈 부분입니다. "레이어 타워"가 무너지면, 주방은 이미 만들어둔 블록들을 재사용하려고 시도합니다. 하지만 연구진은 **71%**의 작업이 낭비된다는 것을 발견했습니다.
- 이렇게 생각해 보세요. 당신이 10분 동안 블록 탑을 쌓았습니다. 그런데 세 번째 블록을 건드렸습니다. 당신은 처음 두 개의 블록을 재사용하려고 노력하지만, 결국 나머지 부분을 다시 쌓아야 합니다. 결과적으로 당신은 노력의 약 **30%**만을 재사용했을 뿐입니다. 나머지 **70%**는 이미 했던 일을 다시 하는 데 낭비되었습니다.
왜 이런 일이 발생할까요?
그것은 당신이 무엇을 바꾸고 있느냐에 달려 있습니다.
- 만약 당신이 **실험(Experiment)**을 미세 조정하고 있다면(AI의 뇌나 데이터를 변경하는 경우), 당신은 타워를 무너뜨릴 가능성이 가장 높습니다. 학습용 박스의 경우 이 빈도가 **46%**에 달합니다.
- 만약 **인프라(Infrastructure)**를 업데이트하고 있다면(주방의 배관이나 전기 같은 것), 당신은 거의 항상 타워를 무너뜨리게 되며, 거의 모든 진척도를 잃게 됩니다.
좋은 소식: 똑똑한 셰프들은 지름길을 찾아냈습니다
이런 난장판 속에서도, 연구진은 일부 똑똑한 셰프들이 이미 이 문제들을 해결하고 있다는 것을 발견했습니다. 그들은 "최고의" 주방들(낭비가 가장 적은 주방들)을 조사했고, 낭비를 막기 위해 사용한 7가지 구체적인 비결을 찾아냈습니다. 이것은 단순한 추측이 아니라, 개발자들이 실제로 효과를 본 실제 변화들입니다.
여기 7가지 비결이 있습니다:
- 식료품을 직접 싸지 마세요: 거대한 데이터셋을 박스 안에 직접 복사하는 대신, 박스가 시작될 때 그것들을 어디에서 가져올지 알려주기만 하세요.
- 모델을 직접 싸지 마세요: AI 모델 자체도 마찬가지입니다. 모델을 박스 안에 구워 넣지 말고, 필요할 때 외부에서 불러오도록 하세요.
- 힘든 일은 미리 하세요: 만약 큰 모델을 다운로드해야 한다면, 레시피의 아주 초반 단계에서 수행하세요. 그래야 나중에 작은 파일을 변경하더라도 큰 다운로드 작업이 캐시(저장)된 상태로 유지됩니다.
- 주방을 분리하세요: CPU와 GPU 모두를 위한 박스가 필요하다면, 모든 것을 다 담은 하나의 거대한 박스를 만들지 마세요. 각각 전문화된 두 개의 작은 박스를 만드세요.
- 적절한 도구를 선택하세요: CPU 버전만 필요하다면 "GPU 버전"의 도구를 설치하지 마세요. 공간을 엄청나게 아낄 수 있습니다.
- 변동성이 큰 것을 뒤로 미루세요: 설정 파일(config files)을 자주 변경한다면, 무거운 설치 작업들보다 뒤쪽에 배치하여 무거운 레이어가 깨지는 것을 방지하세요.
- 전체 히스토리를 다운로드하지 마세요: 인터넷에서 코드를 가져올 때, 프로젝트의 전체 히스토리를 다운로드하지 마세요. 그냥 최신 스냅샷만 가져오세요.
결론
이 논문은 이러한 문제들이 "해결되었다"고 말하는 것이 아닙니다. 현재의 ML 컨테이너는 거대하고, 느리며, 취약하다는 것을 말하고 있습니다. 개발자들은 너무 많은 물건을 박스 안에 집어넣고 너무 빨리 캐시를 깨뜨림으로써, 엄청난 양의 시간(재빌드 노력의 약 70%)을 낭비하고 있습니다.
하지만 희소식은, 우리가 이를 어떻게 고칠 수 있는지 이미 알고 있다는 점입니다. 이 7가지 비결을 사용함으로써, 팀들은 컨테이너를 더 작게 만들고 빌드 속도를 더 빠르게 만들 수 있습니다. 이것은 마법이 아닙니다. 그저 더 나은 정리 정돈의 문제입니다. 연구진은 실제로 박스를 구축하고 시간을 측정했으므로, 이 수치들이 실제임을 확신합니다. 다음에 머신러닝 프로젝트를 보게 된다면 기억하세요. 그것은 단지 코드에 관한 것이 아니라, 당신이 주방을 어떻게 포장하느냐에 관한 것입니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.