Ultralytics가 선호하는 칩에서 YOLO 모델을 더 빠르게 만드는 방법
칩, 메모리, 클럭이 YOLO 속도에 미치는 영향과 양자화, 연산자 융합, 프루닝으로 CPU, GPU, 엣지 디바이스에서 모델을 빠르게 만드는 방법을 알아보세요.
Francesco Mattioli22 분 읽기
Ultralytics에서는 컴퓨터 비전 모델을 만듭니다. 쉽게 말해 컴퓨터가 볼 수 있도록 가르치는 것입니다! 이 모델을 거대한 수학 공식이라고 생각해 보세요. 모델은 연산(레이어라고 부릅니다)과 가중치라고 부르는 방대한 숫자 집합으로 이루어져 있습니다.
Ultralytics YOLO 모델은 이미지를 본질 그대로, 즉 숫자 배열로 처리합니다! 각 픽셀은 색상 값에 불과하며, 이미지의 각 점을 구성하는 빨강, 초록, 파랑(RGB)의 양을 나타냅니다. 이 숫자 배열을 "텐서"라고 부르는데, "다차원 행렬"보다 훨씬 멋지게 들리고, "숫자 위에 숫자를 쌓고 그 위에 또 숫자를 쌓은 것"보다도 훨씬 멋지게 들리기 때문입니다.
이미지를 모델에 입력하면 네트워크를 통과하는 대장정이 시작됩니다. 텐서가 레이어를 하나씩 지나며 변환되고, 합성되고, 수학적으로 뒤섞이는 모습을 상상해 보세요. 숫자들이 어울려 춤추는 파티처럼 생각해 보세요. 숫자들은 고양이를 고양이답게, 자동차를 자동차답게 만드는 본질을 추출합니다. 이 과정을 특징 추출이라고 합니다.
반대쪽 끝에서는 무엇이 나올까요? 더 많은 숫자입니다! 의미 있는 숫자입니다. 객체 감지 작업에서는 이미지 속 대상의 위치와 대상이 무엇일 가능성이 높은지를 정확히 알려줍니다. "이 좌표(x, y)에 있는 것은 개일 확률이 95%입니다!" 이 놀라운 과정을 추론이라고 합니다.
이제 모델이 마법을 부리려면 학교에 가야 합니다. 즉, 학습을 거쳐야 합니다. 학습 과정은 상당히 치열해지는 단계입니다.
학습 중에는 네트워크에 이미지를 제시할 때마다 단순히 답을 얻는 데 그치지 않습니다. 아주 까다로운 작업을 두 가지 수행합니다. 첫째, 네트워크가 얼마나 틀렸는지 계산합니다(이를 손실이라고 부르며, 쉽게 말해 과녁 중심에서 벗어난 정도입니다). 둘째, 그리고 이것이 핵심인데, 그 손실에 따라 네트워크의 모든 숫자(즉, 가중치)를 업데이트합니다. 수천 개의 작은 손잡이를 한꺼번에 조정하는 것처럼 생각해 보세요. 각 조정은 네트워크가 매번 더 정확해지도록 계산됩니다.
기본적으로 네트워크는 교정을 통해 학습합니다. 실수를 할 때마다 해서는 안 될 일을 배우고, 비슷한 이미지를 다시 보았을 때 정답에 더 가까워지도록 모든 가중치를 조정합니다. 다시 말해, 네트워크는 실수를 하나씩 바로잡으며 올바른 방향으로 조금씩 이끌려 예측을 정확하게 해내기 시작할 때까지 학습합니다.
숫자가 얼마나 많을까요? 작고 귀여운 YOLO11n에는 수백만 개의 파라미터가 있습니다. 그런데 YOLO11x는 어떨까요? 무려 5천만 개가 넘는 파라미터를 갖추고 있습니다! 파라미터가 많을수록 더 많은 세부 정보를 인코딩할 수 있습니다. 크레용으로 그림을 그리는 것과 화가의 팔레트를 모두 사용하는 것의 차이와 같습니다.
추론 중에는 이 파라미터 수가 매우 중요해집니다. 파라미터가 300만 개인 네트워크를 실행하는 것은 동네 한 바퀴를 가볍게 뛰는 것과 같습니다. 파라미터가 5천만 개인 네트워크를 실행하는 것은 불타는 횃불을 저글링하며 마라톤을 하는 것에 더 가깝습니다.
그렇다면 연산이란 정확히 무엇일까요? 이 모든 숫자 계산은 실제로 어떻게 이루어질까요? 어떻게 더 빠르게 만들 수 있을까요? 그리고 "연산 최적화"란 대체 무엇을 의미할까요?
칩이 실제로 연산하는 방식#
연산은 칩에서 이루어집니다. 이 작은 실리콘 사각형은 우주에서 가장 질서 정연한 모래성이라고 할 수 있습니다. 컴퓨터가 수행하는 모든 연산, 모든 덧셈과 비교, 모든 "이 조건이면 저것"이 실리콘에 물리적으로 새겨져 있습니다. 칩의 특정 영역에는 숫자를 더하는 물리적 회로가 있고, 논리 연산을 수행하는 회로도 있습니다. 서로 다른 동네가 각기 다른 종류의 수학을 전문으로 하는 작은 도시와 같습니다.
컴퓨터 과학자라도 이 내용이 이상하게 들릴 수 있습니다. 지난 40년 동안 기술이라는 라자냐처럼 추상화 계층을 계속 쌓아 온 탓에 이제는 가장 아래의 접시조차 보이지 않을 정도로 높아졌기 때문입니다. 모든 것을 너무 단순화한 나머지 오늘날 대부분의 프로그래머는 실리콘에서 연산이 실제로 어떻게 이루어지는지 모릅니다. 프로그래머의 잘못이 아니라 그렇게 설계된 결과입니다!
이 계층들을 하나씩 벗겨 보겠습니다. 아주 간단한 다음 Python 코드를 살펴보세요:
x = 1
if x == 1:
y = x + 1변수 x를 만들고 1로 설정한 다음, x가 1과 같으면(그렇습니다) x에 1을 더한 값을 y에 저장합니다. 세 줄입니다. 간단하죠.
하지만 여기서 흥미로운 점이 있습니다. 이 세 줄의 단순한 코드와 실제로 실리콘을 통과하는 전자 사이에는 최소 네 개의 거대한 번역 계층이 작동합니다(실제로는 더 많지만, 요점을 설명하기에는 네 개면 충분합니다). 이 놀라운 과정을 하나씩 살펴보겠습니다:
계층 1: Python → 바이트코드 먼저 Python이 코드를 읽고 바이트코드라는 것으로 컴파일합니다. 바이트코드는 컴퓨터가 처리하기 쉬운 중간 언어이지만, 읽으려고 하면 눈이 빠질 듯한 언어입니다.
계층 2: 바이트코드 → 기계어 Python 인터프리터(CPython 등)가 바이트코드를 받아 프로세서가 실제로 이해하는 명령어인 기계어로 변환합니다. 여기서 우아한 "if x == 1"은 "레지스터 로드, 레지스터 비교, 제로 플래그가 설정되면 점프"와 같은 명령으로 바뀝니다.
계층 3: 기계어 → 마이크로코드 놀라운 반전입니다! 최신 프로세서는 기계어를 직접 실행하지도 않습니다. 기계어를 칩의 내부 구성 요소가 처리할 수 있도록 더 작은 연산인 마이크로코드로 다시 분해합니다. 단일 "ADD" 명령이 여러 마이크로 연산으로 바뀔 수도 있습니다.
계층 4: 마이크로코드 → 물리적 전자 회로 마침내 실리콘에 도달합니다. 마이크로 연산은 트랜지스터를 통해 흐르는 실제 전기 신호를 유발합니다. 수십억 개의 작은 스위치가 켜지고 꺼지며, 전자는 세심하게 설계된 경로를 따라 움직이고, 어떻게든 신기하게도 1 + 1은 2가 됩니다.
각 계층은 바로 아래 계층의 엄청난 복잡성을 감추기 위해 존재합니다. 러시아 인형과 비슷하지만, 인형마다 완전히 다른 언어를 사용하고 가장 작은 인형은 모래 속에 갇힌 번개로 만들어져 있습니다.
아이러니하게도 Python 코드 세 줄이 트랜지스터 스위치를 수백만 번 작동시킬 수 있습니다. 하지만 이러한 추상화 덕분에 그 모든 것을 신경 쓸 필요가 없습니다. 그저 "y = x + 1"이라고 작성하고 실리콘 깊은 곳에서 마법이 일어난다고 믿으면 됩니다.
아키텍처#
모든 연산은 실리콘에 물리적으로 구현되며 칩의 어느 위치에서 실행되는지는 전적으로 칩의 토폴로지에 따라 달라집니다. 전자를 위한 도시 계획과 같습니다. 가산기는 여기, 곱셈기는 저기에 있으며, 모든 구성 요소가 효율적으로 서로 통신해야 합니다.
시장에는 각기 다른 목적에 맞게 설계된 수백 가지 칩이 있습니다. 칩마다 무엇이 달라질까요? 물리적 영역에서 연산을 배치하고 구현하는 방식인 토폴로지입니다. 이를 아키텍처라고 부르며, 정말 다양한 아키텍처가 있습니다:
- x86 (Intel 및 AMD) - 데스크톱 컴퓨팅의 원조로, 복잡하지만 강력합니다.
- ARM - 휴대폰을 구동하며 노트북에도 점점 더 많이 사용되는, 효율성을 고려해 설계된 아키텍처입니다.
- RISC-V - 오픈 소스 반항아로, 곳곳에서 주목받고 있습니다.
- PowerPC - 한때 게임 콘솔에 사용됐고 임베디드 시스템에서 여전히 흔히 볼 수 있는 IBM의 강력한 프로세서
- MIPS - 학계에서 선호하는 단순하고 우아한 아키텍처입니다.
- SPARC - 고성능 컴퓨팅에 기여한 Sun Microsystems(현재 Oracle)의 기술입니다.
- GPU 아키텍처 (NVIDIA의 CUDA 코어, AMD의 RDNA) - 병렬 처리의 강자입니다.
각 아키텍처는 트랜지스터를 서로 다르게 배치할 뿐 아니라 서로 다른 언어를 사용합니다. 이러한 기계에 명령을 전달하는 데 사용하는 추상화도 완전히 다릅니다. 누군가에게 여행 경로를 알려줘야 하는데, 상대방의 자동차에 따라 프랑스어, 중국어 또는 즉흥 무용으로 설명해야 하는 것과 같습니다.
실리콘의 심장 박동#
칩의 연료는 전자, 즉 칩으로 흘러 들어가 연산에 필요한 에너지를 공급하는 전기입니다. 하지만 에너지만으로는 충분하지 않습니다. 칩이 실제로 작동하고 복잡한 토폴로지를 따라 데이터를 이동시키려면 한 가지 핵심 요소에 모든 것이 달려 있습니다. 바로 클록입니다. 클록은 특정 시간에 전자가 특정 경로를 따라 흐르게 합니다. 클록이 없다면 전원이 들어온 실리콘이 아무 일도 하지 않을 뿐입니다.
수십억 개의 구성 요소가 완벽하게 동기화되어 움직여야 하는 대규모 공연을 조율한다고 상상해 보세요. 박자가 없다면 혼란에 빠질 것입니다. 프로세서에서 클록이 하는 역할이 바로 그것입니다. 클록은 매우 일정한 속도로 진동하는 수정으로, 매초 수십억 번 전기 펄스를 보냅니다.
"3.5 GHz 프로세서"라는 말을 들으면 GHz(기가헤르츠)는 클록 속도를 의미하며, 초당 35억 번의 박자를 나타냅니다. 각각의 박자를 클록 사이클이라고 하며, 컴퓨팅에서 기본적인 시간 단위입니다.
클록 사이클 사이에는 아무 일도 일어나지 않습니다. 다음 박자가 올 때까지 컴퓨터 전체가 멈춰 기다립니다. 마치 세상에서 가장 극단적인 무궁화 꽃이 피었습니다 놀이와 같습니다. 매번 "초록불"(클록 펄스)이 켜질 때:
- 구성 요소 사이에서 데이터가 이동합니다.
- 계산이 실행됩니다.
- 논리적 판단이 이루어집니다.
- 메모리를 읽거나 씁니다.
간단한 덧셈처럼 한 사이클이 걸리는 연산도 있고, 나눗셈이나 RAM에서 데이터 가져오기처럼 여러 사이클이 걸리는 연산도 있습니다. 수십억 개의 구성 요소가 각자 정해진 작업을 수행하며 끊임없는 박자에 맞춰 동기화되는 정교한 안무입니다.
프로세서의 클럭 속도를 높여 오버클러킹할 수 있습니다. 모든 작업이 더 빨라지지만 열이 더 많이 발생해 안정성이 떨어집니다. 지나치게 높이면 전자가 처리 속도를 따라가지 못해 컴퓨터가 충돌합니다.
예전에는 이러한 연산이 방 크기만 한 기계로 구현되었습니다. 하지만 모든 연산을 처리하는 구성 요소는 놀라울 정도로 단순합니다. 바로 스위치입니다. 켜짐 또는 꺼짐 상태를 갖는 스위치입니다.
이 스위치들을 적절한 패턴으로 충분히 연결하면 연산을 구현할 수 있습니다. 디지털 혁명은 정교한 스위치 배열로 귀결됩니다.
이러한 단순성 덕분에 스위치만 있으면 어떤 종류든 컴퓨터를 만들 수 있습니다. 사람들은 수도관과 밸브, 도미노, LEGO 블록, 구슬, 심지어 Minecraft의 레드스톤으로도 작동하는 컴퓨터를 만들었습니다.
원리는 1940년대 이후 달라지지 않았습니다. 스위치를 극도로 작게 만드는 기술만 놀라울 정도로 발전했습니다. 휴대폰은 인류를 달에 보낸 모든 컴퓨터를 합친 것보다 더 강력한 연산 능력을 갖추고도 주머니에 들어갑니다. 스위치를 원자 규모로 만드는 방법을 알아냈기 때문입니다.
수백만 개의 파라미터를 가진 신경망을 실행할 때, 우리는 이 작은 스위치들을 초당 수십억 번 작동시키며 수정의 심장 박동에 맞춰 완벽하게 동기화합니다. 모든 가중치 업데이트, 모든 행렬 곱셈, 모든 활성화 함수가 클록의 박자에 맞춰 움직입니다.
모델을 학습시키면 컴퓨터가 이륙이라도 하려는 듯한 소리를 내는 것도 당연합니다!
신경망을 윙윙거리게 만들기#
좋습니다. 이제 수정의 박자에 맞춰 춤추는 수십억 개의 스위치가 있는 칩에서 수백만 개의 파라미터를 가진 신경망을 실행하려고 합니다. 쉬울 것 같죠? 숫자를 칩에 던져 넣고 마음껏 실행하면 됩니다!
신경망을 빠르게 실행하는 것은 냉장고가 세 블록 떨어진 곳에 있고, 프라이팬은 하나뿐이며, 식재료 하나하나가 500파운드인 주방에서 5코스 요리를 하려는 것과 같습니다. 수학 자체가 가장 큰 문제는 아닙니다. 그 밖의 모든 것이 문제입니다.
아키텍처 불일치#
대부분의 칩은 신경망이 아니라 Microsoft Word를 실행하도록 설계되었습니다. CPU는 평생 if 문과 루프를 실행하고 가끔 세금을 계산할 것이라고 생각하며 만들어졌습니다(슈퍼컴퓨터조차 정서적으로 힘들어하는 유일한 연산입니다). CPU는 순차 연산에 최적화되어 있습니다. 이것을 하고, 다음에 저것을 하고, 그다음 다른 것을 합니다.
하지만 신경망은 완전히 다릅니다. 신경망은 모든 일을 한꺼번에 처리하려고 합니다. 학습 중에는 예측이 얼마나 틀렸는지에 따라 수백만 개의 가중치를 업데이트합니다. 추론, 즉 학습된 모델을 실제로 사용하는 동안에는 수백만 개의 계산을 동시에 거쳐 데이터를 처리합니다. 백만 개의 숫자에 다른 백만 개의 숫자를 곱해야 한다고 상상해 보세요. 마음씨 좋은 CPU는 아주 빠르지만 무척 꼼꼼한 회계사처럼 한 번에 하나씩 처리하려고 합니다.
이 때문에 GPU가 AI 컴퓨팅의 핵심이 되었습니다. GPU는 수백만 개의 픽셀 색상을 동시에 계산해야 하는 비디오 게임을 위해 설계되었습니다. 알고 보니 픽셀 색상 계산과 신경망 연산은 놀라울 정도로 비슷합니다. 둘 다 방대한 데이터를 병렬로 처리하며 같은 연산을 반복하기 때문입니다.
하지만 GPU조차 신경망에 완벽하게 맞는 것은 아닙니다. 그래서 기업들은 이제 특수 AI 칩(TPU, NPU 및 PU로 끝나는 온갖 약어)을 만들고 있습니다. 이러한 칩은 한 가지 작업, 즉 신경망을 빠르게 실행하는 일을 위해 처음부터 설계되었습니다. 요리 한 가지만 할 줄 알지만 초인적인 속도로 요리하는 셰프를 고용하는 것과 같습니다. CPU가 행렬 연산을 순차적으로 처리하느라 애쓰고 GPU가 병렬로 꽤 잘 처리하는 동안, 이러한 특수 칩은 아침, 점심, 저녁으로 행렬을 먹어 치웁니다.
메모리 장벽(또는 비트를 이동하는 일이 연산보다 어려운 이유)#
최신 신경망 연산에서는 데이터를 실제로 연산하는 것보다 데이터를 이동하는 데 더 많은 시간과 에너지를 씁니다.
컴퓨터 칩을 번개처럼 빠르게 일하지만 참고 서적을 모두 도시 곳곳의 서로 다른 건물에 보관해 둔 뛰어난 수학자라고 생각해 보세요. 어떤 방정식이든 즉시 풀 수 있지만, 먼저 숫자를 가져와야 하고 그 과정은 영원히 걸립니다.
칩은 두 숫자를 한 클록 사이클 안에 곱할 수 있습니다(초당 수십억 번의 박자 중 하나라는 점을 기억하세요). 번개처럼 빠릅니다! 하지만 메모리에서 칩으로 숫자를 가져오는 데는 수백 사이클이 걸릴 수 있습니다. 수학자가 문제를 1초 만에 풀 수 있지만 도서관에 다녀오는 데 5분이 걸리는 것과 같습니다.
그 이유는 거리와 공간 때문입니다. 전기는 빠르게 이동하지만 무한히 빠르지는 않습니다. 데이터가 칩에서 이동해야 하는 거리가 멀수록 더 오래 걸립니다. 컴퓨터 설계자들은 거리가 서로 다른 여러 저장 위치를 두는 것처럼 메모리 계층 구조를 만들어 이 문제를 해결했습니다:
- 레지스터(연산 장치에 직접 내장): 수학자의 책상입니다. 즉시 접근할 수 있습니다! 하지만 공간이 아주 작아 여기에는 숫자를 약 32개만 보관할 수 있습니다. 바로 앞에 포스트잇을 붙여 두는 것과 같습니다.
- L1 캐시(몇 마이크로미터 떨어진 곳): 사무실의 책장입니다. 데이터를 가져오는 데 3~4사이클이 걸립니다. 여기에 숫자를 수천 개 저장할 수 있습니다.
- L2 캐시(몇 밀리미터 떨어진 곳): 복도 끝의 서류 캐비닛입니다. 10~15사이클이 걸리며 숫자를 수백만 개 저장할 수 있습니다.
- L3 캐시(칩 반대편): 아래층의 창고입니다. 30~50사이클이 걸리고 숫자를 수천만 개 저장합니다.
- RAM(완전히 다른 칩에 있음): 도시 건너편의 창고입니다. 100~300사이클이 걸립니다. 수십억 개의 숫자가 여기에 저장됩니다.
- SSD/하드 드라이브(케이블로 연결): 완전히 다른 도시입니다. 수백만 사이클이 걸립니다. 저장 공간은 방대하지만 속도는 빙하처럼 느립니다.
정확한 구조는 장치마다 다릅니다. 휴대폰 칩에는 L3 캐시가 없을 수 있지만 서버 CPU에는 방대한 L3 캐시가 있을 수 있습니다. 그러나 원리는 같습니다. 가까운 메모리는 더 빠르지만 용량이 더 작습니다.
이제 신경망에서 문제가 되는 지점을 살펴보겠습니다. Ultralytics YOLO 모델에 파라미터가 5천만 개 있다고 가정해 보세요(참고로 ChatGPT에는 수십억 개가 있습니다). 메모리와 연산 장치 사이를 오가야 하는 숫자가 5천만 개라는 뜻입니다. 숫자 하나가 4바이트에 불과하더라도 시스템을 이동해야 하는 데이터는 200MB에 달합니다.
칩은 각 숫자를 한 사이클 만에 처리할 수 있지만 RAM에서 숫자를 가져오는 데 100사이클이 걸린다면 시간의 99%를 데이터가 도착하기만 기다리며 보내게 됩니다. 교통 체증에 갇힌 포뮬러 1 경주용 자동차와 같습니다. 막강한 연산 능력을 갖추고도 데이터가 도착하기만 기다리는 상황입니다.
여기서 중요한 점은 이것이 최신 컴퓨팅의 병목 현상이라는 것입니다. 이를 폰 노이만 병목 현상이라고 합니다. 연산 속도를 높이는 일은 비교적 쉽습니다. 메모리 속도를 높이는 일은 물리적 한계에 부딪히고 있습니다. 이것이 바로 AI 성능 최적화의 거의 모든 부분이 메모리 수준에서 이루어지는 이유입니다. 엔지니어가 신경망을 더 빠르게 만들 때 연산 자체를 더 빠르게 하는 경우는 드뭅니다. 대신 데이터를 덜 이동하고, 더 효율적으로 캐시하거나, 더 영리하게 접근하는 방법을 찾습니다.
최신 AI 칩은 연산 속도에만 집중하지 않습니다. 메모리 대역폭과 데이터 이동 전략을 중점적으로 최적화합니다. 데이터를 미리 가져오고, 캐시에 이미 있는 값을 재사용하며, 메모리 접근을 최소화하도록 연산을 구성합니다. AI 하드웨어 경쟁에서 승리하는 기업은 가장 빠른 계산기를 만든 곳이 아니라 계산기에 데이터를 끊임없이 공급하는 방법을 찾아낸 곳입니다. 모든 것은 메모리 접근 패턴 최적화에 달려 있습니다.
데이터를 조금이라도 옮길 때마다 에너지가 소모됩니다. 많지는 않습니다. 피코줄 단위이지만, 초당 테라바이트를 옮기면 그 양이 빠르게 늘어납니다. 실제로 칩 내부에서 데이터를 1mm 옮기는 데 드는 에너지가 실제 연산에 필요한 에너지보다 더 큽니다!
신경망을 학습할 때 노트북에서 제트 엔진 같은 소리가 나는 이유가 바로 여기에 있습니다. 열을 발생시키는 것은 수학 연산이 아니라 데이터 이동입니다. 모든 파라미터 업데이트, 모든 그래디언트 계산, 모든 순전파가 말 그대로 방을 뜨겁게 만듭니다.
최신 AI 가속기는 사실상 열역학 실험과 같습니다. 칩이 녹기 전에 연산을 얼마나 많이 집적할 수 있을까요? 열을 얼마나 빠르게 식힐 수 있을까요? 오버클러킹과 비슷하지만, 클럭은 늘 최고 수준이고 화재가 나지 않도록 애쓰는 상황입니다.
해결책은 무엇일까요? 아키텍처를 고려한 설계입니다.#
가장 빠른 신경망이 반드시 가장 똑똑한 것은 아닙니다. 칩을 고려해 설계된 신경망이 가장 빠릅니다. 이러한 신경망은 다음과 같은 특징이 있습니다.
- 데이터를 가능한 한 로컬에 유지합니다.
- 연산을 철저히 재사용합니다.
- 하드웨어의 성능에 완벽하게 맞춥니다.
- 메모리 이동을 어떤 대가를 치르더라도 최소화합니다.
이는 "동네 식료품점에서 재료를 구하세요"라고 안내하는 레시피와 티베트에서 향신료를, 프랑스에서 치즈를, 남극에서 물을 수입해야 하는 레시피의 차이와 같습니다. 둘 다 맛있을 수 있지만, 하나가 훨씬 실용적입니다.
신경망을 빠르게 만드는 일이 예술인 이유가 바로 여기에 있습니다. 수학을 잘하는 것만으로는 충분하지 않습니다. 하드웨어를 이해하고, 메모리 계층 구조를 존중하며, 아키텍처와 완벽하게 호흡을 맞춰야 합니다.
컴퓨터 과학과 물리학, 공학, 순수한 마법이 만나는 세계에 오신 것을 환영합니다. 숫자 하나를 옮기는 데 그 숫자를 계산하는 것보다 더 많은 비용이 드는 세계입니다. 병렬 처리는 빠르지만 동기화는 치명적입니다. 가장 큰 적은 복잡성이 아니라 거리입니다.
YOLO를 더 빠르게 만드는 방법#
YOLO 모델을 학습하면 학습 환경에서는 훌륭하게 작동하는 신경망을 얻게 됩니다. 하지만 게이밍 GPU, iPhone, 보안 카메라에 들어가는 작은 칩은 서로 완전히 다른 언어를 사용합니다. 각 장치는 강점과 약점이 다르고 데이터를 처리하는 방식도 크게 다릅니다.
이렇게 생각해 보세요. GPU에는 동시에 작업할 수 있는 코어가 수천 개 있으며, 병렬 처리를 위해 설계되었습니다. 반면 모바일 칩에는 AI 연산에 특화된 회로가 있을 수 있지만, 처리할 수 있는 수학 연산의 유형은 제한적입니다. 초인종 카메라에 들어가는 엣지 디바이스는 LED 전구보다 적은 전력으로 AI를 실행해야 합니다.
Ultralytics는 각 형식이 서로 다른 하드웨어에 최적화되어 있기 때문에 12가지가 넘는 다양한 내보내기 형식을 지원합니다. 옵션이 너무 많다는 뜻이 아닙니다. 여러분의 구체적인 요구 사항에 맞는 옵션을 제공한다는 뜻입니다.
연산 융합: 더 적은 자원으로 더 많은 작업 수행#
기존 YOLO 모델에서는 많은 연산이 순차적으로 수행됩니다. 예를 들어, 합성곱을 수행한 다음 결과를 정규화하고 활성화 함수를 적용할 수 있습니다. 이 과정은 각각 별도의 메모리 읽기와 쓰기가 필요한 세 단계로 이루어집니다.
하지만 여기에는 기발한 방법이 있습니다. 이러한 연산을 하나의 단계로 결합할 수 있습니다. 배포를 위해 YOLO를 내보낼 때 이러한 연산을 융합합니다. 다음과 같이 처리하는 대신:
- 합성곱 계산 → 메모리에 저장
- 메모리에서 불러오기 → 정규화 → 메모리에 저장
- 메모리에서 불러오기 → 활성화 적용 → 메모리에 저장
다음과 같이 처리합니다.
- 합성곱 + 정규화 + 활성화 계산 → 메모리에 저장
640×640 이미지를 처리하는 일반적인 YOLO 모델에서는 이 간단한 기법으로 불필요한 메모리 전송을 수 GB 줄일 수 있습니다. 휴대폰에서는 이 차이가 부드러운 실시간 탐지와 답답한 지연을 가릅니다.
더 작은 수 사용: 양자화의 마법#
YOLO는 객체를 정확하게 탐지하기 위해 초정밀 숫자가 필요하지 않습니다. 학습 중에는 각 가중치를 표현하는 데 32비트를 사용합니다. 이는 샌드위치 재료를 계량하는 데 공학용 계산기를 쓰는 것과 같습니다. 실제 배포에서는 8비트로도 충분합니다.
이를 양자화라고 하며, 가장 강력한 최적화 기법 중 하나입니다. 더 작은 숫자를 사용하면 다음과 같은 이점이 있습니다:
- 모델 크기가 75% 줄어듭니다(Ultralytics YOLO11x의 경우 200MB에서 50MB로 감소).
- 대부분의 장치에서 2~4배 더 빠르게 실행됩니다.
- 전력 소모가 크게 줄어듭니다(휴대폰 배터리도 고마워할 것입니다).
YOLO의 모든 레이어가 이러한 축소에 똑같이 민감한 것은 아닙니다. 기본적인 에지와 형태를 감지하는 초기 레이어는 안정적이므로 문제없이 8비트 숫자를 사용할 수 있습니다. "이것이 고양이인가, 개인가?"를 판별하는 최종 탐지 레이어에는 조금 더 높은 정밀도가 필요합니다. 따라서 정확도를 유지하면서 속도를 극대화하는 데 필요한 최소한의 비트만 사용하도록 레이어별 정밀도를 조정합니다.
최적의 알고리즘 선택#
같은 수학 연산을 수행하는 방법은 수십 가지입니다. YOLO의 핵심 연산인 단순 합성곱도 완전히 다른 알고리즘으로 계산할 수 있으며, 최적의 선택은 사용 중인 하드웨어와 입력 크기에 따라 달라집니다.
YOLO를 내보낼 때 최적화 프레임워크는 실제로 여러 알고리즘을 테스트하고 특정 사례에 가장 빠른 알고리즘을 선택합니다. 이는 같은 목적지로 가는 여러 경로 중 현재 교통 상황에 따라 경로를 선택하는 것과 같습니다. GPU에서는 많은 픽셀을 동시에 처리하는 알고리즘을 사용할 수 있습니다. CPU에서는 순차 처리에 최적화된 알고리즘을 사용할 수 있습니다. 수학은 같지만 실행 전략은 완전히 다릅니다.
메모리: 숨겨진 병목#
현대 컴퓨팅에서 메모리가 실제 병목이라고 말씀드린 것을 기억하시나요? YOLO에서는 특히 그렇습니다. 모델에 파라미터가 5천만 개 있을 수 있고, 추론 중에는 중간 결과가 수 GB 생성됩니다. 이러한 데이터를 옮기는 작업은 실제 연산보다 느린 경우가 많습니다.
메모리 이동을 최소화하기 위해 몇 가지 기법을 사용합니다.
스마트 스케줄링: 데이터가 빠른 캐시 메모리에 있는 동안 바로 사용되도록 연산 순서를 구성합니다. YOLO의 피처 피라미드 네트워크에서는 이 방법으로 메모리 트래픽을 40% 줄입니다.
타일링: 이미지 전체를 한 번에 처리하는 대신 캐시에 들어가는 작은 타일로 나눕니다. 그러면 프로세서가 느린 메인 메모리에서 계속 데이터를 가져오는 대신 빠른 로컬 메모리로 작업할 수 있습니다.
버퍼 재사용: 중간 결과를 저장하기 위해 메모리를 계속 새로 만드는 대신 같은 메모리 버퍼를 재사용합니다. 매우 효율적인 방법입니다. YOLO의 전체 백본도 재사용 가능한 버퍼 몇 개만으로 실행할 수 있습니다.
가지치기: 적을수록 좋습니다#
놀라운 사실은 YOLO 모델이 필요 이상으로 복잡하게 설계되는 경우가 많다는 점입니다. 정확도에 거의 영향을 주지 않고 많은 레이어의 채널을 제거할 수 있는 경우가 많습니다. 이는 단순히 모델 크기를 줄이는 데 그치지 않고, 수행해야 하는 연산 수를 실제로 줄여 모델 속도를 높입니다.
이 과정은 정교합니다. 네트워크에서 최종 감지 결과에 가장 적게 기여하는 부분을 분석해 제거한 다음, 이를 보완하도록 모델을 미세 조정합니다. 배터리로 작동하는 디바이스에서는 이러한 효율성 향상으로 작동 시간을 몇 시간 늘릴 수 있습니다.
하드웨어 가속: 각 칩의 강점 활용#
프로세서마다 잘하는 작업이 다르며, 성능 격차는 단순히 클럭 속도의 차이에서 비롯되는 것이 아니라 근본적인 아키텍처 차이를 반영합니다. GPU에는 병렬로 작동하는 수천 개의 코어가 있어 YOLO의 합성곱 연산에 적합합니다. 모바일 NPU에는 신경망 전용으로 설계된 특수 회로가 있습니다. CPU는 다용도로 유연하지만 특화되어 있지는 않습니다.
최적화의 핵심은 YOLO 연산을 각 칩이 가장 잘 처리하는 작업에 맞추는 것입니다. GPU는 동일한 연산을 대량의 데이터에 동시에 적용하는 데 적합합니다. 모바일 NPU는 지원하는 연산이 제한적일 수 있지만, 지원하는 연산은 매우 효율적으로 실행합니다. Edge TPU는 8비트 정수만 처리하지만, 그 제약 안에서 놀라운 속도를 구현합니다.
컴파일의 마법#
YOLO 모델을 내보내면 보이지 않는 곳에서 놀라운 일이 일어납니다. 단순히 파일 형식을 변환하는 것이 아니라, 대상 하드웨어에 맞춰 모델을 실제로 컴파일합니다. 이는 Google 번역과 원어민의 차이와 같습니다. 컴파일 과정은 다음과 같습니다.
- 모델을 분석하여 구조와 요구 사항을 파악합니다.
- 하드웨어의 성능을 고려하여 하드웨어의 강점과 어려워하는 작업을 파악합니다.
- 최적화된 코드를 생성하여 하드웨어의 기본 언어로 실행되도록 합니다.
컴파일러는 프로세서 캐시를 더 잘 활용하도록 연산 순서를 재구성하거나, 칩에서 지원하는 특수 명령어를 선택하거나, 머신러닝을 사용해 최적의 최적화 전략을 찾을 수 있습니다. 그렇습니다. AI를 최적화하는 데 AI를 사용합니다. 미래가 이미 도래했습니다!
이 컴파일 단계만으로 성능이 10배 차이 날 수 있습니다. 동일한 YOLO 모델도 범용 코드에서는 느리게 실행되지만, 제대로 최적화된 명령어를 사용하면 빠르게 실행될 수 있습니다.
실제 엣지 배포#
YOLO가 실제 환경, 특히 까다로운 엣지 디바이스에서 작동할 때 어떤 일이 일어나는지 살펴보겠습니다. 객체 감지를 위해 YOLO를 24시간 내내 실행해야 하는 보안 카메라를 상상해 보세요. 보안 카메라는 다음과 같은 엄격한 제약에 직면합니다:
- 메모리: 전체 RAM이 512MB~2GB에 불과할 수 있습니다.
- 전력: 보통 2~5와트에 불과합니다(휴대폰 충전기보다 적은 수준).
- 냉각: 팬 없이 수동으로 열을 발산합니다.
- 안정성: 충돌 없이 지속적으로 실행되어야 합니다.
핵심은 적절한 절충점을 선택하는 것입니다. 엣지 디바이스에서는 다음과 같은 방법을 자주 사용합니다.
- INT8 양자화를 사용합니다(정밀도는 낮추고 전력은 크게 절감).
- 활동이 적을 때는 처리하는 프레임 수를 줄입니다.
- 열을 관리하기 위해 여러 프로세서에 작업을 분산합니다.
- 모델 전체가 빠른 메모리에 들어갈 만큼 작게 유지합니다.
최적화 과정#
Ultralytics에서는 체계적인 접근 방식으로 최적화를 진행합니다. 먼저 모델 프로파일링을 통해 실제로 시간이 어디에 사용되는지 파악합니다. 병목은 예상과 다른 곳에 있는 경우가 많습니다. 전체 시간의 80%가 몇 개의 레이어에서만 사용되거나, 메모리 전송이 연산 시간을 압도할 수 있습니다.
그다음 최적화를 반복적으로 적용합니다.
- 가장 큰 병목부터 시작합니다.
- 한 번에 하나의 최적화를 적용합니다.
- 속도 향상과 정확도 영향을 모두 측정합니다.
- 절충 효과가 좋은 최적화는 유지합니다.
- 목표에 도달할 때까지 반복합니다.
미래: 이기종 컴퓨팅#
최신 장치는 여러 프로세서를 함께 사용하는 방식이 점점 더 지능화되고 있습니다. 휴대폰에는 프로세서가 하나만 있는 것이 아니라, 각기 다른 작업에 특화된 여러 프로세서가 있습니다.
- 카메라 센서에는 전처리를 위한 ISP(이미지 신호 프로세서)가 있습니다.
- NPU(신경망 처리 장치)는 YOLO 추론을 실행합니다.
- CPU는 복잡한 로직과 조정을 처리합니다.
- GPU는 화면에 결과를 렌더링합니다.
YOLO 최적화의 미래는 여러 프로세서에 모델을 지능적으로 분할하는 데 있습니다. NPU가 주요 합성곱을 처리하고, CPU가 최종 탐지 로직을 담당하며, GPU가 결과를 시각화할 수 있습니다. 각 프로세서는 가장 잘하는 작업을 수행하므로 단일 프로세서로는 구현할 수 없는 효율적인 파이프라인이 만들어집니다.
사용 가능한 프로세서의 성능뿐 아니라 프로세서 간 데이터 이동 비용까지 고려하여 YOLO를 여러 프로세서에 가장 적합하게 분할하는 방법을 자동으로 찾아내는 스마트 분할 알고리즘을 개발하고 있습니다.
핵심 요약#
YOLO 모델 최적화는 단순한 파일 형식 변환이 아닙니다. 최첨단 AI를 실제 환경에서 작동하는 형태로 바꾸는 과정입니다. 양자화(더 작은 숫자 사용), 가지치기(불필요한 부분 제거), 연산 융합(단계 결합), 효율적인 메모리 관리 등의 기법으로 정확도를 유지하면서도 큰 성능 향상을 얻을 수 있습니다.
놀라운 점은 모든 상황에 적용되는 단 하나의 "최적" 최적화가 없다는 것입니다. 전력이 무제한인 클라우드 서버에는 배터리로 작동하는 드론과 다른 최적화가 필요합니다. 전용 AI 칩이 있는 휴대폰에는 Raspberry Pi와 다른 최적화가 필요합니다. Ultralytics가 다양한 내보내기 옵션을 제공하는 이유는 각 옵션이 서로 다른 사용 사례에 최적화되어 있기 때문입니다.
지금까지 논의한 모든 최적화는 한 가지 목표를 위한 것입니다. 컴퓨터 비전을 어디서나 사용할 수 있도록 하는 것입니다. 스마트 도어벨, 드론 애플리케이션 또는 대규모 클라우드 서비스를 구축하든, 제약 조건에 맞춰 YOLO를 실행할 수 있는 도구를 제공합니다.
Ultralytics로 YOLO 모델을 내보낼 때 단순히 파일을 저장하는 것이 아닙니다. 신경망을 실용적으로 구현하기 위한 수년간의 연구 성과를 활용하는 것입니다. 최첨단 AI 모델을 실제 하드웨어에서 실제 제약 조건에 맞춰 실행하고 실제 문제를 해결할 수 있는 형태로 변환합니다.
이것이 Ultralytics가 하는 일입니다. AI 연구와 실제 배포 사이의 간극을 좁힙니다. AI의 미래는 단순히 최고의 모델을 보유하는 것이 아니라, 그 모델을 실제 환경에서 유용하게 만드는 데 있기 때문에 컴퓨터 비전이 어디서나 작동하도록 합니다.
작성자
댓글
질문하거나 결과를 공유하거나 다른 사람을 도와주세요.










