스크립트
00:00:00프로그래밍 언어인 Mojo가 드디어 1.0 버전을 출시했는데, 시기가 좀 묘합니다.
00:00:05처음엔 소스코드가 비공개인 상태로 나왔다가 7일 만에 오픈소스로 전환되었고,
00:00:09퀄컴이 그 회사를 인수했습니다.
00:00:12하지만 잠시 그 이야기는 제쳐두죠.
00:00:14Mojo의 진짜 핵심은 속도를 위해 C++이나 CUDA를 포기하지 않으면서도 파이썬 같은 코드를 쓸 수 있다는 점입니다.
00:00:20정말 그 약속을 지키는지 한번 확인해 보겠습니다.
00:00:27Mojo의 핵심은 바로 이 질문에서 시작됩니다.
00:00:30코드가 파이썬처럼 생기고 느껴지면서도,
00:00:34C++이나 CUDA를 내려놓지 않고 실제로 중요한 부분을 실행할 수 있다면 어떨까요?
00:00:39CPU와 GPU를 아우르는 하나의 가독성 좋은 언어 말입니다.
00:00:42그게 바로 이 프로젝트의 전부입니다.
00:00:43마침내 Mojo가 1.0이 된 지금, 이 모든 장점이 과연 얼마나 현실적인지 직접 확인해보고 싶었습니다.
00:00:49그러니 퀄컴의 인수나 오픈소스 이야기로 넘어가기 전에, 일단 코드를 실행해 보죠.
00:00:53작업 속도를 높여주는 코딩 도구에 관심이 있으시다면 구독해 주세요.
00:00:57유용한 영상들이 계속 업로드됩니다.
00:00:59제 PC에서 직접 보여드릴 테지만, 여기서 Mojo 튜토리얼을 진행하려는 건 아닙니다.
00:01:03만약 Mojo를 한 번도 본 적이 없다면 파이썬처럼 보이겠지만,
00:01:07몇 가지 핵심적인 차이점을 보시게 될 겁니다.
00:01:10왼쪽은 파이썬 코드입니다.
00:01:12오른쪽은 Mojo 코드고요.
00:01:13동일한 루프, 동일한 그리드, 동일한 반복 횟수입니다.
00:01:17여기서 수학적 계산 원리를 일일이 설명하진 않겠습니다.
00:01:20두 개의 while 루프를 잘 보세요.
00:01:21똑같은 작업을 수행하고 있습니다.
00:01:23먼저 파이썬 코드를 실행해 보겠습니다.
00:01:26좋습니다.
00:01:27실행되었네요.
00:01:28끝났습니다.
00:01:28이번에는 동일한 프로그램을 Mojo로 컴파일해서 실행해 보죠.
00:01:32마찬가지로 실행합니다.
00:01:35짠.
00:01:35완료되었습니다.
00:01:36참고로 체크섬의 마지막 자리는 완벽히 일치하지 않습니다.
00:01:3925만 번 연산 중에서 수백 정도의 미세한 차이가 납니다.
00:01:43파이썬은 곱셈을 먼저 하고 덧셈을 수행하지만,
00:01:45Mojo 컴파일러는 이를 하나의 명령어로 통합(fusing)할 수 있거든요.
00:01:49일부 픽셀 처리에서 반복이 한 번 더 일어날 수 있습니다.
00:01:51여기서는 걸린 시간(초)을 진짜 성능 지표로 봐주세요.
00:01:54이건 NumPy도 아니고,
00:01:55특정 모델도 아닙니다.
00:01:56단순히 CPU 루프 속도가 빨라진 것만이 성능의 전부가 아닙니다.
00:02:00파이썬은 다루기 쉽기 때문에 개발을 시작하기에 좋습니다.
00:02:03하지만 성능이 중요해지면 C++이나 CUDA로 넘어가야 하죠.
00:02:06그러면 결국 두 개의 파일을 관리해야 하고, 둘은 점차 엇갈리기 시작합니다.
00:02:09그래서 Mojo가 던지는 질문은 이것입니다.
00:02:12우리가 읽고 작성하는 파일과 GPU를 구동하는 파일이 정확히 동일할 수 있을까요?
00:02:17이 함수가 바로 커널입니다.
00:02:18각각의 GPU 스레드가 한 쌍의 숫자를 더합니다.
00:02:20그게 전부죠.
00:02:21Metal, Swift, CUDA로 전환한 게 아닙니다.
00:02:24그냥 컴파일하면 됩니다.
00:02:26자, 이렇게 코드가 실행되었습니다.
00:02:28그렇습니다.
00:02:30Mojo는 꽤 흥미로운 일을 해낼 수 있습니다.
00:02:32평소에 일반 코드를 작성하던 언어(파이썬)를 그대로 사용해서 맥북 위에서 작동하는 GPU 커널을 컴파일해 낸 거죠.
00:02:38파이썬으로 말입니다.
00:02:40머신러닝 코드는 다루기 쉽기 때문에 파이썬으로 시작합니다.
00:02:44우리 모두 잘 아는 사실이죠.
00:02:45그러다 시간이 지나면 결국 성능이 중요해집니다.
00:02:48그래서 중요한 부분들을 C++이나 CUDA로 다시 작성하게 되죠.
00:02:52결과적으로 우리는 동일한 시스템의 두 가지 버전을 유지보수하게 됩니다.
00:02:55시간이 흐를수록 이런 상황은 혼란만 가중시킵니다.
00:02:58Mojo의 지향점은 읽기 좋은 파일과 성능이 빠른 파일이 완전히 동일하다는 것입니다.
00:03:03이 모든 것의 중심에는 크리스 라트너(Chris Lattner)가 있습니다.
00:03:06그는 LLVM을 만들었고, Clang과 Swift를 개발했죠.
00:03:10하지만 GPU 커널을 실행하는 것과 별개로,
00:03:14언어 버전을 1.0이라고 부르는 것은 또 다른 문제입니다.
00:03:18그렇다면 여기서 1.0이 실제로 의미하는 바는 무엇일까요?
00:03:21Mojo가 완전히 완성되었다는 뜻은 아닙니다.
00:03:23대략적인 '안정성'을 갖추었다는 의미에 가깝습니다.
00:03:25오늘 작성한 코드가 앞으로 깨지지 않을 것이라는 약속 같은 거죠.
00:03:29이러한 메이저 릴리스가 가진 의미가 바로 그렇습니다.
00:03:30하지만 여기서 첫 번째 의아한 부분이 나옵니다.
00:03:32Mojo는 컴파일러가 오픈소스가 되기도 전에 버전 1.1에 도달했습니다.
00:03:37표준 라이브러리는 이미 2024년 3월에 공개되었고,
00:03:40맥스 커널(max kernels)은 2025년에 공개되었습니다.
00:03:43하지만 핵심인 컴파일러만큼은 올해 8월 18일 전까지 소스코드가 비공개 상태로 유지되었습니다.
00:03:50Apache 2.0 라이선스로 풀렸는데, 불과 7일 전 Mojo 1.0이 출시되었을 때만 해도 여전히 비공개였기에 이는 매우 중요합니다.
00:03:57이로써 지난 3년 동안 Mojo가 받아온 가장 큰 비판 중 하나가 해소되었습니다.
00:04:02예전에는 “좋긴 한데 컴파일러가 비공개잖아”라는 말을 할 수 있었죠.
00:04:05이제는 그런 말을 하기 어렵게 되었으니 올바른 방향으로 나아가고 있는 것처럼 들립니다.
00:04:10실제로 그럴지도 모릅니다.
00:04:10불과 3주 전에 일어난 일을 살펴보기 전까지는 말이죠.
00:04:14퀄컴의 모듈러(Modular) 인수 작업은 7월 29일에 완료되었습니다.
00:04:16Mojo 1.0은 8월 11일에 출시되었고요.
00:04:19컴파일러는 8월 18일에 오픈소스로 공개되었습니다.
00:04:21즉, Mojo 역사상 가장 큰 개방 마일스톤이 모듈러가 독립 기업이 아니게 된 지 불과 3주도 되지 않아 일어난 것입니다.
00:04:29이 때문에 이 상황을 완전히 다르게 해석할 수 있는 두 가지 시각이 즉각 생겨납니다.
00:04:33첫 번째는 퀄컴이 Mojo를 모든 곳에서 쓰게 하고 싶어서 모듈러를 인수했다는 시각입니다.
00:04:37아마 아닐 겁니다.
00:04:37혹은 퀄컴이 모듈러를 인수했고, 결국 이 모든 기술이 훨씬 더 거대 기업의 시스템에 흡수될 것이라는 시각이죠.
00:04:44퀄컴은 칩을 만드는 회사입니다.
00:04:45칩에서 잘 컴파일되는 언어는 훨씬 더 큰 가치를 지니게 됩니다.
00:04:49우리는 이제 자유롭게 사용할 수 있습니다.
00:04:50그러니 오픈소스 전환 조치는 납득이 갑니다.
00:04:53하지만 Mojo의 성공 여부는 아마 퀄컴에 의해 결정되지는 않을 것입니다.
00:04:57애초에 언어를 갈아탈 만큼 Mojo가 실제로 충분히 훌륭한가에 달려 있겠죠.
00:05:02하지만 바로 이 지점에서 상황이 복잡해지기 시작합니다.
00:05:05Mojo에는 벤치마크와 관련된 문제가 있습니다.
00:05:072023년 당시 내세웠던 엄청난 수치는 Mojo가 파이썬보다 6만 8천 배 더 빠를 수 있다는 것이었습니다.
00:05:13말도 안 되는 수치죠.
00:05:14DNA 파싱 작업에서 Mojo가 Rust보다 50% 더 빠르다고 주장하는 게시물도 여전히 남아 있습니다.
00:05:19그 벤치마크 결과는 산산조각이 났습니다.
00:05:21해당 벤치마크가 애초에 측정하려던 것을 제대로 측정한 게 아니라는 점이 밝혀졌거든요.
00:05:25여전히 3만 5천 배라는 수치가 이리저리 떠도는 것을 볼 수 있습니다.
00:05:29그 수치는 행렬 곱셈에서 나온 것입니다.
00:05:31하지만 그들이 비교하고 있는 대상은,
00:05:34한쪽에는 완전히 벡터화되고 병렬화 및 타일링된 Mojo 구현체입니다.
00:05:40다른 한쪽에는 순수 파이썬으로 작성된 삼중 중첩 루프가 있죠.
00:05:44그렇습니다, 삼중 루프요.
00:05:45NumPy도 아니고, 세상 그 누구도 실제로 사용하지 않을 중첩 루프 말입니다.
00:05:49그래서 저는 3만 5천 배 더 빠르다는 주장에는 별로 관심이 없습니다.
00:05:52직접 제 컴퓨터에서 나온 수치가 필요했습니다.
00:05:54M4 Pro 환경에서 순수 파이썬과 비교해 보았죠.
00:05:57순수 파이썬 대비 26.5배 더 빨랐습니다.
00:06:00NumPy와 비교했을 때는 연산당 약 2배 정도 더 빨랐습니다.
00:06:05물론 26배가 6만 8천 배는 아닙니다.
00:06:08하지만 NumPy는 이미 내부적으로 C로 구현되어 있기 때문에 26배라는 수치도 여전히 대단한 겁니다.
00:06:14이 시점에서는 파이썬을 이긴다기보다,
00:06:16더 나은 메모리 처리 방식으로 C를 이기는 것에 가깝습니다.
00:06:19그리고 바로 이 점이 Mojo를 보며 답답함을 느끼는 부분입니다.
00:06:21하지만 성능이 제가 오늘날 Mojo 사용을 주저하는 가장 큰 이유는 아닙니다.
00:06:25전에도 가지고 놀아봤고,
00:06:27오늘 여기서 직접 실행도 해보고 있죠.
00:06:28진짜 문제는 '안정성'입니다.
00:06:30자, 이게 얼마나 안정적일까요?
00:06:32Mojo 1.0은 int, print, len 같은 핵심 내장 함수를 포함해 41개의 불안정한 API 경고와 함께 출시되었으니까요.
00:06:40소위 안정성 릴리스라는 버전 안에서 불안정하다고 표시되어 있었습니다.
00:06:45그리고 Mojo가 코드가 깨지지 않을 것이라고 약속한 바로 그날, FN 키워드를 제거하면서 약 39개의 패키지 생태계가 망가졌습니다.
00:06:52Mojo의 작동 방식에서 매우 중요했던 FN 키워드가 완전히 사라진 것입니다.
00:06:58더 이상 지원되지 않죠.
00:06:59컴파일러가 이제 오픈소스가 되긴 했지만, 아직 외부 기여를 받아들이지는 않고 있습니다.
00:07:04그러니 Mojo 1.0이 안정적이라고 말할 수는 있겠네요.
00:07:07하지만 그들이 말하는 만큼 안정적이지는 않을지도 모릅니다.
00:07:09결국 우리에게 가장 중요한 단 하나의 질문으로 귀결됩니다.
00:07:12이걸 써야 할까요?
00:07:13만약 여러분이 GPU 커널이나 CUDA, Triton 같은 세계를 다룬다면 Mojo는 확실히 하루이틀 투자해 볼 가치가 있다고 생각합니다.
00:07:21CPU와 GPU를 아우르는 단 하나의 언어이며, 저는 노트북에서 작동하는 GPU 커널을 컴파일해 냈으니까요.
00:07:27이런 기능을 제공하는 언어는 그리 많지 않습니다.
00:07:29하지만 여전히 발전해야 할 부분이 많습니다.
00:07:31그러니 당장 최우선 순위에 두지는 않는 것이 좋겠습니다.
00:07:353년 전, Mojo에 대한 반대 의견은 꽤 단순했습니다.
00:07:38멋진 새 언어이긴 한데, 누가 이걸 쓰겠냐는 거였죠.
00:07:40개발자들에게 모든 것을 걸라고 요구하는, 스타트업이 만든 폐쇄적인 언어였습니다.
00:07:44오늘날 컴파일러는 Apache 2.0 라이선스를 따릅니다.
00:07:47언어는 1.0 버전에 이르렀고요.
00:07:48그 스타트업은 이제 퀄컴의 일부가 되었습니다.
00:07:51BetterStack의 Josh였습니다.
00:07:53이와 같은 코딩 팁과 요령이 흥미로우셨다면 구독해 주세요.
00:07:56다음 영상에서 뵙겠습니다.
커뮤니티 글
아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!
이 영상에 대해 글쓰기