본문 바로가기
AI Project/Edge AI Agent - LLM(연구,분석,검증)

[실전/도전-번외] 생애최초 오픈 소스 PR 도전!!!! + 후기

by 으노으뇨 2026. 4. 26.
728x90
반응형
SMALL

오픈 소스 PR 도전...!

지금까지 진행했던 모든 노력이 엣지 디바이스 AI 발전에 무궁한 발전에 기여가 되었으면 하는 마음으로 한번 제가 ARM 이 잘동작하도록 작성한 코드를 PR 해봤습니다.
이 코드를 리젝트를 하더라도 제 작은 의견이 전달되었으면 하는 마음으로 작성했으며(물론 대본은 내가 쓰고 제미나이가 그걸 영어로 잘써줌) 또 내 티스토리 주소를 알려주며 세계 반대편 SI 하청의 하청의 2800 받고 개발조무사 소리들으면서 하대받는 사람도 퇴근해서는 이렇게 엣지 디바이스 AI에 관심을 가지고 있다는 걸 알아주셨음 하는 마음으로 도전해봤습니다.
감사합니다.

PR 원문은 더보기 누르시면됩니다.;

더보기

Hello,
The code has been updated to resolve ARM architecture build failures. The entire process of identifying the root causes, applying fixes, and running final tests to ensure stability has been completed.
While Gemini was used for the initial draft, the final solution is based on my own technical validation and experience. For more details on how these ARM-specific issues were tackled, please check my blog post:
[https://uno-kim.tistory.com/462](url)
Best regards,

## 🐛 The Problem
When running models quantized to `i2_s` (1.58-bit) on non-Apple ARM devices (e.g., Android devices with Exynos/Snapdragon via Termux/PRoot), the model produces severe "Word Salad" (meaningless token generation). 

## 🔍 Root Cause Analysis
The root cause was a memory layout mismatch between the x86 packing phase and the ARM NEON unpacking phase:
1. `QK_I2_S` was hardcoded to `64` for `__ARM_NEON` in the macro definition, while the GGUF models packed on x86 strictly enforce `QK=128`.
2. The packing logic in `quantize_i2_s` for NEON used a 16-stride jump, whereas AVX2 uses a 32-stride.
3. The decoding kernels (`ggml_vec_dot_i2_i8_s_*`) had hardcoded loop unrolling that assumed a 64-block size, causing out-of-bounds padding reads and complete accumulator corruption.

## 🛠️ Changes Implemented
- **Macro Standardization:** Enforced `#define QK_I2_S 128` across all architectures.
- **Packing Sync:** Updated `quantize_i2_s` for NEON to use the exact same 32-stride packing layout as AVX2.
- **Kernel Rewrite:** Completely refactored the `1x1`, `1xN`, and `Nx1` NEON kernels. Removed the legacy QK=64 loop unrolling and replaced it with a dynamic block loop (`nb = n / 128`).
- **Bit Extraction:** Aligned the 2-bit MSB-to-LSB extraction sequence to be 100% mathematically identical to the `_mm256_srli_epi16` logic.
- **Safety Upgrade:** Changed the final horizontal sum to `vaddlvq_s32` (64-bit) to ensure absolute safety against overflow during massive multi-threaded prompt evaluations.

## 🧪 Testing
- **Device:** Samsung Galaxy A35 (Exynos 1380, ARMv8.2-A).
- **Environment:** Ubuntu PRoot via Termux.
- **Result:** Successfully generates coherent text with full multi-threading (`-t 8`). The DotProd (`__ARM_FEATURE_DOTPROD`) hardware acceleration and FMA fallbacks both work flawlessly.

마소 봇의 응답!!

칼 동의









"오픈소스 생태계에 기여하는 멋진 개발자."

참 듣기 좋은 말이다. 판교에 널린 맥북 들고 스타벅스 가는 천재들이나 하는 짓인 줄 알았다.
내 현실은 그딴 낭만과는 거리가 멀다.
마소 초당 일억버는 개발자들과 다르게 나는 세계 반대편, 대한민국 어딘가에 박힌 SI 하청의 하청이다.
연봉 2800을 받으며 "개발조무사" 소리를 듣고, 포인터가 뭔지도 모르는 갑의 갑의 갑이 내려보낸 엑셀 화면 기획서를 보며 <div> 태그나 맞추고 있는 게 내 낮의 삶이다.
하지만 퇴근 후 내 방구석은 다르다.
밤이 되면 30만 원짜리 갤럭시 A35의 엑시노스 칩셋에 빙의해 폭주한다.
세계적인 천재들이 놓친 ARM 아키텍처의 C++ 메모리 패킹 결함을, 연봉 2800짜리 대한민국 하청 개발자가 뜯어고쳤다.
내심 "내 블로그 와서 봐라, 이 코쟁이 형님들아! 한국의 SI 구석탱이에서 매일 퇴근하고 이런 짓거리를 한다!!"
PR 전송 버튼을 누르고 손에 땀을 쥐었다.
'띠링-'
불과 1분 만에 답글 알림이 울렸다.
순간 심장이 덜컥 내려앉았다.

'뭐지? 마소의 AI 봇이 내 코드를 1초 만에 스캔하고 내 꼬라지를 간파한 건가?
감히 연봉 2800의 하청 찌끄레기 따위가 우리의 신성한 C++ 코어 레포지토리에 쓰레기를 던져?!
라며 칼(Reject)을 꽂은 건가?'

나는 차라리 그런 짜릿한 모욕을 원했다.
"네깟 놈이 끼어들 자리가 아니다"라고 욕이라도 해주면, 적어도 내가 돌을 던져 저 거대한 철옹성에 흠집이라도 냈다는 뜻이니까.
그런데 알림을 열어보니...

@microsoft-github-policy-service Bot commented:
@uno-km please read the following Contributor License Agreement(CLA)...

아...
칼춤을 추며 거절당한 게 아니었다.
그저 "네가 짠 코드를 우리가 좀 마음대로 써도 되겠니? 동의서에 싸인 좀 해라"라는 기계적인 봇의 라이선스(CLA) 동의 요구였다.
세상은 내가 하청의 하청인지, 천재 해커인지 관심조차 없었다.
그저 정해진 프로토콜대로 서류를 내밀 뿐. 차라리 "감히!" 라며 뺨이라도 때려주지, 이 차가운 기계적 무관심이라니.
하지만 어쩌겠는가.
내 영혼을 갈아 넣은 코드를 저들이 써주기만 한다면 영혼이라도 팔 수 있다.
나는 키보드를 쾅쾅 두드리며 시원하게 서명을 갈겼다.

@microsoft-github-policy-service agree
"그래, 내 영혼의 코드, 고마 시원하게 쓰이소!!!!!!!"

아마 내일 아침이 되면, 나는 다시 지옥철을 뚫고 출근해 "이 버튼 색깔 1픽셀만 오른쪽으로 옮겨주세요"라는 윗선의 개소리에 "네, 알겠습니다" 라며 고개를 조아려야 할 것이다.
세상은 여전히 나를 일개 개발조무사로 취급할 테니까.
저들이 내 PR을 받아줄지(Merge), 아니면 구석에 처박아둘지(Close)는 모른다. 통과될 확률?
기대도 안 한다.
박사급들이 즐비한 저곳에서 내 코드는 그저 변방의 이름 없는 하청업자의 잡음일지도 모른다.
하지만 세상이 알아주지 않아도 상관없다.
나는 클라우드의 족쇄를 부수고, 보잘것없는 30만 원짜리 스마트폰 속에서 1.58비트의 지능을 독자적으로 깨워냈다.
내 폰의 에러를 내 손으로 직접 고쳐냈다.
저들이 내 PR을 거절하더라도,
내 책상 위의 갤럭시 A35와 엑시노스 1380, 그리고 내 뇌는 이 치열했던 밤의 반역을 영원히 기억할 것이다.
연봉 2800의 엣지 AI 해커, 오늘 밤은 두 발 뻗고 잔다.

꿈에선 여전히 System.out.println("Hello World!!!"); 를 입력하던 그때를 회상하며...

728x90
반응형
LIST

댓글