
AI와 GPU와 CUDA와 PyTorch. 그리고 AI 엔지니어란 무엇인가.
요약
AI 프로젝트 참여를 앞두고 CUDA, PyTorch, Tensor 등 새로운 개념을 학습하며 겪은 시행착오와 로컬 GPU 환경 구축 과정을 다룹니다. 이론적 한계를 코드와 인덱스로 극복하고, RTX 3060을 활용해 Colab보다 빠른 로컬 개발 환경을 마련한 경험을 공유합니다.
핵심 포인트
- Tensor와 다차원 배열의 개념적 이해와 코드 중심 접근법
- AI 학습을 위한 로컬 GPU(RTX 3060 12GB) 구축의 필요성
- 클라우드 환경 대비 로컬 환경의 성능적 이점 체감
- 수치 연산 및 그래픽스 기술의 역사적 흐름과 AI의 연결
드디어 5월도 끝나가고, 곧 제가 싫어하는 장마가 찾아옵니다.
그러던 중, 뜻하지 않게 6월부터 CUDA나 PyTorch를 사용한 프로젝트에 참여하게 되었습니다.
4월쯤에 "AI 프로젝트에 관여하게 될지도 모른다"라는 예감이 들었기에, 사전에 생성 AI (Generative AI)를 가정교사로 삼거나 서적을 구입하는 등, Google Colab을 중심으로 예습을 진행해 왔습니다.
하지만 역시 나이 탓인지, 새로운 개념(특히 가타카나 용어)을 외우는 능력은 쇠퇴하고 있음을 느끼지 않을 수 없습니다. 스칼라 (Scalar), 벡터 (Vector), 매트릭스 (Matrix)까지는 지난 30년의 개발 경험을 통해 이해하고 있다고 생각했습니다만, 막상 뚜껑을 열어보니 본래의 의미를 오해하고 있었다는 사실을 깨달았습니다.
특히 안 됐던 것이 "텐서 (Tensor)". 이것이 도무지 머릿속에 들어오지 않았습니다.
하물며 다차원 이야기가 되면, 인간이 직관적으로 이미지화할 수 있는 것은 3차원(Excel 시트 3장을 조합하여 입체로 만드는 듯한 감각)까지입니다. 4차원 이상을 어떻게 판단해야 할지 전혀 알 수 없었습니다.
답답한 마음에 AI에게 물어보았더니, "4차원 이상은 인간이 직관적으로 이해할 수 없습니다"라고 일축당했고, 오히려 묘하게 안심했던 기억이 납니다.
뭐, 30년이나 이 세계(IT·임베디드 업계)에 있다 보니, 다차원 배열 (Multi-dimensional Array) 프로그램 자체는 다뤄본 적이 있습니다. 요컨대 "뇌내 이미지는 포기하고, 코드와 인덱스 (Index)로 외우면 된다"라고 단념할 수 있었습니다.
그 후에도 CNN이다, RNN이다 하며 새로운 가타카나 용어와의 격투가 시작되었습니다.
역시 이쯤 되니 클라우드 (Cloud, Colab)가 아니라 "실제로 GPU를 구매해서, 내 손안의 로컬 환경 (Local Environment)에서 프로그램을 돌려보고 싶다"라는 엔지니어의 본능이 꿈틀거립니다.
그래서 Windows 11을 지원하지 않는 오래된 CPU가 탑재된 소유 중인 워크스테이션 (DELL Precision T3620)에, ASUS의 GeForce RTX 3060 12GB를 장착하기로 했습니다.
지금까지 일에만 매진해 왔기에, PC로 게임을 하는 일 따위는 단 한 번도 없었습니다.
생각해 보면 40년 전, NEC의 V30 (CMOS 버전 8086 호환)을 판매하던 시절, 모 C사의 계장으로부터 "8087 (부동소수점 연산 코프로세서)을 구매할 수 없겠느냐?"라는 상담을 받았던 것이 제가 수치 연산 프로세서의 존재를 알게 된 첫 시작이었습니다.
그 후 업무에서 OpenGL이나 DirectX를 다룰 기회는 다소 있었지만, 당시의 저는 "소수점 이하의 데이터가 비트 (Bit) 레벨에서 어떻게 관리되는가"를 깊게 신경 쓰지 않았습니다. 설마 그 범위를 진정으로 이해하려고 하는 것이 30년 후(지금)가 될 줄이야, 인생은 알 수 없는 법입니다.
색 (Color)의 취급에 대해서는, Windows 95 화면의 속성에서 "1677만 색 (RGB)"을 확인한 것이 원체험입니다. 그 후 시대는 RGBA가 되었고, 게임용 PC에서는 GPU가 없으면 처리가 따라가지 못해 화면이 버벅거리는 환경을 보아왔습니다.
막상 그래픽 보드 (Graphics Board)를 사려고 하니 종류가 너무 많아 놀랐습니다. 공급 전원 용량 문제, VRAM 용량, 그리고 가격. 독학용이라 해도 이 정도 급 (RTX 3060 12GB)이 되면 중고라도 4만 엔 이상은 하며, 물리적으로 슬롯에 설치해야 하기에 PCIe 여유 슬롯도 필수입니다.
무사히 부품이 도착하여 케이스를 열고 장착했습니다만, 최근의 GPU는 히트싱크 (Heatsink) 덩어리라 "정말 무겁습니다". 요즘 세상에서 떠들썩한 "AI 데이터 센터의 전력 공급·냉각 문제"를 몸소 미니어처 체험한 기분이었습니다.
하지만 고생해서 구축한 로컬 환경을 돌려보니, Google Colab (무료 버전)과는 비교도 안 될 정도로 빠릅니다. 역시 실기 (Real Machine)가 정의입니다.
이번 환경은 Ubuntu Desktop 24.04 LTS. 실제로 IDE는 VS Code를 사용하며, 다양한 편리한 도구들도 있어 이제 Windows 환경으로는 돌아갈 수 없을 정도로 좋은 환경을 만들었습니다. 원격 데스크톱 (Remote Desktop)도 가능하다면 아주 좋은 환경이 될 것입니다.
저와 마찬가지로 "텐서 (Tensor)"나 "4차원 이상"에서 막히고 있는 프로그래머 분들을 위해, 저 나름의 "단념하는 법"을 메모해 둡니다. 고상한 수학으로 받아들이려 하기에 파탄이 나는 것이지, 메모리 공간 (Memory Space)으로 바라보니 단번에 해결되었습니다.
4차원 텐서 [B, C, H, W]의 정체
이미지 인식 (CNN)에서 빈번하게 등장하는 4차원 텐서는 뇌 속에서 4차원 공간을 왜곡시킬 필요가 없습니다.
그저 "구조체 (이미지 데이터)가 메모리 상에 시리얼 (Serial)하게 나열된 배열"입니다.
Python
import torch
# 뇌내 이미지: 224x224 RGB 이미지를 메모리 상에 16장 연속으로 확보한 거대한 배열
images = torch.randn(16, 3, 224, 224)
print(images.shape) # torch.Size([16, 3, 224, 224])
C 언어의 감각으로 말하자면, 그저 "4중 루프(4-layer loop)로 접근하는 다차원 배열"이며, 포인터가 가리키는 곳에 있는 하나의 메모리 영역에 불과합니다.
PyTorch에서의 GPU 조작 기본도, 실제로 해보니 과거 x87 코프로세서(8087)의 데이터 전송과 본질은 같았습니다.
Python
import torch
데이터를 메인 메모리(CPU 측)에 확보
cpu_tensor = torch.randn(1000, 1000)
PCIe 버스를 통해 GPU의 VRAM(RTX 3060)으로 전송
gpu_tensor = cpu_tensor.to('cuda')
GPU 측에서 초병렬 계산 (순식간에 종료)
result_gpu = torch.matmul(gpu_tensor, gpu_tensor)
결과를 메인 메모리(CPU 측)로 회수
result_cpu = result_gpu.to('cpu')
메인 CPU가 서툰 무거운 부동 소수점 연산(Floating-point operation)을 전용 하드웨어(GPU)에 통째로 맡기고 버스(PCIe)를 경유하여 되돌려 받는다. 40년 전에 쫓았던 기술의 연장선상에 지금의 생성형 AI나 딥러닝(Deep Learning)이 있다고 생각하니 매우 감회가 새롭습니다.
새로운 도전을 위한 무대는 마련되었습니다. 기억력은 젊은 시절을 따라갈 수 없지만, 지금까지 쌓아온 "구조로 이해하는 능력"과 "끈기 있게 코드를 읽어내는 경험"을 무기로 6월부터 시작될 실무에 도전하고자 합니다.
다음 회차부터는 실제 업무 이야기도 포함하여, 노병이 어떻게 AI·딥러닝을 공부하고 현장에서 핸들링(Handling)해 나가는지에 대한 투박한 과정을 게재해 나가겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기