Slide 1

Slide 1 text

Korea Android 신입 안드로이드 개발자의 AI 스타트업 생존기 (+ Native C++ Code를 Android에서 사용해보기) 김도엽 ZETIC.ai super.init(version=6)

Slide 2

Slide 2 text

게임 개발자에서 안드로이드 개발자로

Slide 3

Slide 3 text

우테코에서 나는.. 도메인 객체에 id..?

Slide 4

Slide 4 text

ZETIC.ai 합류 아이템 좋아 보임 당장 먹고 살아야함 졸업 후 공백 싫음 처우 나쁘지 않아 보임 취업 안됨 (서류 0합)

Slide 5

Slide 5 text

ZETIC.ai 합류 아이템 좋아 보임 당장 먹고 살아야함 졸업 후 공백 싫음 취업 안됨 (서류 0합) 사실 별 생각 없음! 처우 나쁘지 않아 보임

Slide 6

Slide 6 text

AI? 난 모름... 이것 뭐에요..?

Slide 7

Slide 7 text

다행인 점 범용 온디바이스 AI 모델 “추론” 라이브러리 개발 모델을 직접 설계하고 개발할 필요는 없음

Slide 8

Slide 8 text

ʻ내가 모르는 것’이 아니라 ʻ내가 알고 있는 것’에 집중하자 게임 개발 C++, 컴퓨터 공학, 최적화, 디버깅, CMake, 빌드 안드로이드 개발 설계, Kotlin, Android, JNI 온디바이스 AI 추론 서비스 개발! + 기초적인 인공지능 지식

Slide 9

Slide 9 text

ZETIC.ai에서 나는.. Segmentation Fault요? “우리도 결국엔 usability 확장을 지금 당장 LLM만 우선적으로 hugging face support달고있지만, 여러모델들 지난번 도엽님이 whisper모델 한것처럼 다 huggingface에서 출발할 수 있게도 좀 봐야할것 같아요” memcpy(), malloc() 너 나가 객체지향..? 클린 코드..? 함수형..? 어이 김씨 거기 메모리 누수나 막아 그러니까 Quantization이 뭐냐면.. 오 어제 한명 접속했어요

Slide 10

Slide 10 text

개발 세계관의 확장

Slide 11

Slide 11 text

내 마음속의 로드맵.. 테스트 인프라 실 사용자 확보

Slide 12

Slide 12 text

Native C++ Code를 Android에서 사용해보기 Korea Android super.init(version=6)

Slide 13

Slide 13 text

온디바이스 AI의 기술적 요구사항 1. 클라우드가 아닌 디바이스에서 AI 모델 실행 2. 고성능 모델의 최적화 필요 3. 컴퓨팅 자원의 제한적 사용 4. C++로 작성된 외부 라이브러리 사용 웬만한 일은 C++에서!

Slide 14

Slide 14 text

온디바이스 AI의 기술적 요구사항 최적화해야한다 빌드해야한다 야껴야한다 모델 전/후처리

Slide 15

Slide 15 text

CMake 1. 빌드 파일 자동 생성 2. MakeFile, Visual Studio Solution, XCode 용 빌드 파일 생성도 지원 3. Gradle에서 지원 4. https://cmake.org/ CMakeLists.txt

Slide 16

Slide 16 text

CMake Foo.cpp Foo.h

Slide 17

Slide 17 text

CMake Directory Structure Shell

Slide 18

Slide 18 text

쉘 스크립트와 함께 1. 여러 아키텍처로 라이브러리 빌드 2. 빌드 전/후처리 3. 복잡한 CMake 옵션 설정

Slide 19

Slide 19 text

Android NDK (Native Development Kit) 1. Android에서 C, C++ 코드를 사용할 수 있게 해주는 일련의 도구 모음 2. 네이티브 코드 빌드, 실행 3. JNI를 통해 Java(Kotlin) 코드와 상호작용 4. Java GC 관리 대상 아님

Slide 20

Slide 20 text

JNI (Java Native Interface) 1. JNI는 Java와 네이티브 코드(C/C++) 간의 상호작용을 위한 인터페이스 2. Java VM (Dalvik/ART)과 네이티브 코드 간의 함수 호출 규약 정의 3. Java 객체 생성 및 조작 4. Java <-> Native 간 데이터 변환 (Marshalling & Unmarshalling) 5. 네이티브 스레드 연결 6. JNIEnv 구조체

Slide 21

Slide 21 text

함수 호출 규약 Java 코드와 C/C++ 코드 간에 상호작용을 가능하게 하는 인터페이스 제공 Java_<패키지명>_<클래스명>_<메서드명>

Slide 22

Slide 22 text

JNIEnv 구조체 1. Java 객체 생성, 조작 2. Java 객체 참조 관리 (LocalRef, GlobalRef, WeakGlobalRef) 3. Marshalling & Unmarshalling 4. 네이티브 스레드 연결

Slide 23

Slide 23 text

Android Studio에서 설정 1. Gradle에서 CMake 빌드 설정 2. JNI 메소드 생성

Slide 24

Slide 24 text

아키텍쳐 제안 Kotlin Class Wrapper Class JNI (C++) Native Code Kotlin Class Wrapper Class

Slide 25

Slide 25 text

Kotlin Class Wrapper Class JNI (C++) Native Code 아키텍쳐 제안 JNI (C++) Native Code

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Overview CMake로 빌드되는 C++ 프로젝트를 Gradle에 포함시켜 NDK로 빌드하고 런타임에 로드, JNI로 Java (Kotlin)과 상호작용

Slide 28

Slide 28 text

C++ 쓰면 다 되는거 아닌가요? 1. Java <-> 네이티브 코드 데이터 변환도 비용이 발생한다. 2. Java의 GC는 네이티브 코드에서 할당한 메모리는 해제하지 못한다. 3. 반대로 네이티브에서 해제된 메모리에 접근 할 위험도 존재 a. 메모리 생명주기 관리

Slide 29

Slide 29 text

감사합니다. Korea Android super.init(version=6)