์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ“ฑ ๋‚ด ํฐ ์•ˆ์— AI๊ฐ€ ์‚ฐ๋‹ค! Core ML๊ณผ TensorFlow Lite๋กœ ๋งŒ๋“œ๋Š” ์˜จ๋””๋ฐ”์ด์Šค AI ์•ฑ ์™„์ „์ •๋ณต

๐Ÿ“ฑ ๋‚ด ํฐ ์•ˆ์— AI๊ฐ€ ์‚ฐ๋‹ค! Core ML๊ณผ TensorFlow Lite๋กœ ๋งŒ๋“œ๋Š” ์˜จ๋””๋ฐ”์ด์Šค AI ์•ฑ ์™„์ „์ •๋ณต

#์˜จ๋””๋ฐ”์ด์ŠคAI#CoreML#TFLite#LiteRT

์นœ๊ตฌ์•ผ, ์š”์ฆ˜ AI๋ผ๊ณ  ํ•˜๋ฉด ๋‹ค๋“ค ๊ฑฐ๋Œ€ํ•œ ์„œ๋ฒ„์—์„œ GPU ์ˆ˜์ฒœ ์žฅ์ด ๋Œ์•„๊ฐ€๋Š” ์žฅ๋ฉด์„ ๋– ์˜ฌ๋ฆฌ์ž–์•„?
๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค ๋„ค ์ฃผ๋จธ๋‹ˆ ์† ์Šค๋งˆํŠธํฐ๋„ ์ด๋ฏธ ๊ฝค ๋˜‘๋˜‘ํ•œ AI ๋จธ์‹ ์ด์•ผ. ์‚ฌ์ง„ ์•ฑ์—์„œ "๊ฐ•์•„์ง€"๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด ๊ฐ•์•„์ง€ ์‚ฌ์ง„๋งŒ ์™์™ ๋ฝ‘์•„์ฃผ๋Š” ๊ธฐ๋Šฅ, ๊ทธ๊ฑฐ ์ƒ๋‹น ๋ถ€๋ถ„์ด ํฐ ์•ˆ์—์„œ ์ง์ ‘ ๋Œ์•„๊ฐ€๋Š” AI ๋•๋ถ„์ด๊ฑฐ๋“ .

์˜ค๋Š˜์€ ์ด ์˜จ๋””๋ฐ”์ด์Šค(On-Device) AI๋ฅผ ๋‚ด ์•ฑ์— ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์„, iOS ์ง„์˜์˜ Core ML๊ณผ ์•ˆ๋“œ๋กœ์ด๋“œยทํฌ๋กœ์Šคํ”Œ๋žซํผ ์ง„์˜์˜ TensorFlow Lite(ํ˜„์žฌ ์ด๋ฆ„์€ LiteRT)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ˆ˜๋‹ค ๋–จ๋“ฏ ํ’€์–ด๋ณผ๊ฒŒ. ์ปคํ”ผ ํ•œ ์ž” ๋“ค๊ณ  ํŽธํ•˜๊ฒŒ ๋”ฐ๋ผ์™€! โ˜•

๋ฐ์ดํ„ฐ๋Š” ํฐ ์•ˆ์—, ์ถ”๋ก ๋„ ํฐ ์•ˆ์— AI ๋ชจ๋ธ CPUยทGPUยทNPU Core ML TFLiteยทLiteRT ๐Ÿ”’ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ โšก ๋น ๋ฅธ ์‘๋‹ต โœˆ๏ธ ์˜คํ”„๋ผ์ธ ๋™์ž‘ ๐Ÿ’ฐ ์„œ๋ฒ„๋น„ ์ ˆ๊ฐ ํด๋ผ์šฐ๋“œ ์™•๋ณต ์—†์ด ๊ธฐ๊ธฐ ์•ˆ์—์„œ ๋ฐ”๋กœ ์ถ”๋ก !

๐Ÿค” 1. ์˜จ๋””๋ฐ”์ด์Šค AI๊ฐ€ ๋Œ€์ฒด ๋ญ๊ธธ๋ž˜?

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด AI ๋ชจ๋ธ์˜ "์ถ”๋ก (inference)"์„ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ ์•ˆ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฑฐ์•ผ.
ํ•™์Šต(training)์€ ๋ณดํ†ต ๋ฐ์ดํ„ฐ์„ผํ„ฐ์—์„œ ๋๋‚ด๊ณ , ์™„์„ฑ๋œ ๋ชจ๋ธ์„ ๊ฐ€๋ณ๊ฒŒ ๋‹ค๋“ฌ์–ด์„œ ์•ฑ์— ๋„ฃ์–ด ๋ฐฐํฌํ•˜๋Š” ๊ตฌ์กฐ์ง€.

๊ทธ๋Ÿผ ์™œ ๊ตณ์ด ํฐ์—์„œ ๋Œ๋ฆฌ๋ƒ๊ณ ? ์ด์œ ๊ฐ€ ๊ฝค ํ˜„์‹ค์ ์ด์•ผ.

๐Ÿ”’ ํ”„๋ผ์ด๋ฒ„์‹œ
์–ผ๊ตด ์‚ฌ์ง„, ์Œ์„ฑ, ๊ฑด๊ฐ• ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๊ธฐ ๋ฐ–์œผ๋กœ ์•ˆ ๋‚˜๊ฐ€. ๊ฐœ์ธ์ •๋ณด ์ด์Šˆ์— ๋ฏผ๊ฐํ•œ ์š”์ฆ˜ ์ด๊ฑด ์—„์ฒญ๋‚œ ์žฅ์ ์ด์•ผ.
โšก ์ง€์—ฐ ์‹œ๊ฐ„
๋„คํŠธ์›Œํฌ ์™•๋ณต์ด ์—†์œผ๋‹ˆ ์นด๋ฉ”๋ผ ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด. AR ํ•„ํ„ฐ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฒˆ์—ญ ๊ฐ™์€ ๊ธฐ๋Šฅ์—” ํ•„์ˆ˜์ง€.
โœˆ๏ธ ์˜คํ”„๋ผ์ธ
์ง€ํ•˜์ฒ , ๋น„ํ–‰๊ธฐ, ์‚ฐ์†์—์„œ๋„ ๋™์ž‘ํ•ด. ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋„ ๊ธฐ๋Šฅ์€ ๋ฉ€์ฉก!
๐Ÿ’ฐ ๋น„์šฉ
์ถ”๋ก  ์—ฐ์‚ฐ์„ ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ๊ฐ€ ๋‚˜๋ˆ  ๋งก์œผ๋‹ˆ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋„ GPU ์„œ๋ฒ„๋น„๊ฐ€ ๊ทธ๋งŒํผ ํญ์ฆํ•˜์ง€ ์•Š์•„.

๋ฌผ๋ก  ๊ณต์งœ ์ ์‹ฌ์€ ์—†์–ด. ํฐ์€ ๋ฉ”๋ชจ๋ฆฌยท๋ฐฐํ„ฐ๋ฆฌยท๋ฐœ์—ด์ด๋ผ๋Š” ๋นก๋นกํ•œ ์ œ์•ฝ์ด ์žˆ์–ด์„œ, ์„œ๋ฒ„์—์„œ ์“ฐ๋˜ ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋ธ์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์„ ์ˆ˜๋Š” ์—†๊ฑฐ๋“ . ๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ ๋ชจ๋ฐ”์ผ ์ „์šฉ ์ถ”๋ก  ํ”„๋ ˆ์ž„์›Œํฌ, ์˜ค๋Š˜์˜ ์ฃผ์ธ๊ณต ๋‘˜์ด์•ผ.

๐ŸŽ 2. Core ML: ์• ํ”Œ ์ƒํƒœ๊ณ„์˜ ๊ณต์‹ AI ์—”์ง„

Core ML์€ ์• ํ”Œ์ด 2017๋…„ WWDC์—์„œ iOS 11๊ณผ ํ•จ๊ป˜ ๊ณต๊ฐœํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ์•ผ. iPhone, iPad, Mac, Apple Watch, Apple TV, Vision Pro๊นŒ์ง€ ์• ํ”Œ ๊ธฐ๊ธฐ ์ „๋ฐ˜์—์„œ ์“ธ ์ˆ˜ ์žˆ์–ด.

Core ML์˜ ์ง„์งœ ๋งค๋ ฅ์€ ํ•˜๋“œ์›จ์–ด๋ฅผ ์•Œ์•„์„œ ๊ณจ๋ผ ์“ด๋‹ค๋Š” ์ ์ด์•ผ. ๋ชจ๋ธ์„ ์‹คํ–‰ํ•˜๋ฉด Core ML์ด ์—ฐ์‚ฐ์„ CPU, GPU, Neural Engine(ANE) ์ค‘ ์ ์ ˆํ•œ ๊ณณ์— ๋ถ„๋ฐฐํ•ด์ค˜. Neural Engine์€ A11 Bionic๋ถ€ํ„ฐ ๋“ค์–ด๊ฐ„ ์• ํ”Œ์˜ ์ „์šฉ AI ๊ฐ€์†๊ธฐ์ธ๋ฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ €์ˆ˜์ค€ ์ฝ”๋“œ๋ฅผ ์งค ํ•„์š” ์—†์ด Core ML์„ ํ†ตํ•ด์„œ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์กฐ์•ผ.

๐Ÿงฐ Core ML ํŒจ๋ฐ€๋ฆฌ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ
๋„๊ตฌ์—ญํ• 
Core ML๋ชจ๋ธ ๋กœ๋”ฉยท์ถ”๋ก  ์‹คํ–‰ ์—”์ง„
Vision์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜, ์–ผ๊ตดยทํ…์ŠคํŠธ ์ธ์‹, ๊ฐ์ฒด ์ถ”์  ๋“ฑ ๋น„์ „ ์ž‘์—… + Core ML ๋ชจ๋ธ ์—ฐ๊ฒฐ
Natural Language์–ธ์–ด ๊ฐ์ง€, ํ† ํฐํ™”, ๊ฐ์ • ๋ถ„์„ ๋“ฑ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ
Sound Analysis / Speech์†Œ๋ฆฌ ๋ถ„๋ฅ˜, ์Œ์„ฑ ์ธ์‹
Create MLMac์—์„œ ์ฝ”๋“œ ์—†์ด(๋˜๋Š” Swift๋กœ) ๋ชจ๋ธ ํ•™์Šต
coremltoolsPyTorchยทTensorFlow ๋ชจ๋ธ์„ Core ML ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” Python ํŒจํ‚ค์ง€

๐Ÿ“ฆ ๋ชจ๋ธ ํฌ๋งท: .mlmodel๊ณผ .mlpackage

์˜ˆ์ „์—” ๋ชจ๋ธ ํŒŒ์ผ์ด .mlmodel ํ•˜๋‚˜์˜€๋Š”๋ฐ, ์ง€๊ธˆ์€ ML Program์ด๋ผ๋Š” ์ƒˆ ๋ชจ๋ธ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ .mlpackage(ํด๋” ํ˜•ํƒœ ํŒจํ‚ค์ง€)๊ฐ€ ํ‘œ์ค€์ด ๋์–ด. ML Program์€ iOS 15 ์ด์ƒ์—์„œ ๋™์ž‘ํ•˜๊ณ , ๊ฐ€์ค‘์น˜๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•ด์„œ ํฐ ๋ชจ๋ธ๊ณผ ๋‹ค์–‘ํ•œ ์ •๋ฐ€๋„(Float16 ๋“ฑ)๋ฅผ ๋‹ค๋ฃจ๊ธฐ ํŽธํ•ด.

๐Ÿ”„ ๋ณ€ํ™˜: coremltools๋กœ PyTorch ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ

์š”์ฆ˜ ์—ฐ๊ตฌยท์‹ค๋ฌด ๋ชจ๋ธ ๋Œ€๋ถ€๋ถ„์ด PyTorch๋กœ ๋งŒ๋“ค์–ด์ง€์ž–์•„? coremltools๋Š” TorchScript๋กœ traceํ•œ ๋ชจ๋ธ์ด๋‚˜ ์ตœ์‹  ๋ฒ„์ „์—์„  torch.export ๊ฒฐ๊ณผ๋ฌผ์„ ๋ฐ›์•„์„œ Core ML๋กœ ๋ณ€ํ™˜ํ•ด์ค˜. ๋Œ€๋žต ์ด๋Ÿฐ ๋А๋‚Œ์ด์•ผ.

import torch, torchvision
import coremltools as ct

model = torchvision.models.mobilenet_v3_small(weights="DEFAULT").eval()
example = torch.rand(1, 3, 224, 224)
traced = torch.jit.trace(model, example)

mlmodel = ct.convert(
    traced,
    inputs=[ct.ImageType(name="image", shape=example.shape,
                         scale=1/255.0)],
    convert_to="mlprogram",
    minimum_deployment_target=ct.target.iOS16,
)
mlmodel.save("MobileNetV3.mlpackage")
๐Ÿ’ก ๊ฟ€ํŒ
ImageType์œผ๋กœ ์ž…๋ ฅ์„ ์ง€์ •ํ•˜๋ฉด ์•ฑ์—์„œ CVPixelBuffer(์นด๋ฉ”๋ผ ํ”„๋ ˆ์ž„)๋ฅผ ๋ฐ”๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์„œ ์ „์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ํ™• ์ค„์–ด. ๋‹จ, ImageNet ์ •๊ทœํ™”(ํ‰๊ท ยทํ‘œ์ค€ํŽธ์ฐจ)์ฒ˜๋Ÿผ ์ฑ„๋„๋ณ„ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋ธ์€ scaleยทbias ๊ฐ’์„ ์ •ํ™•ํžˆ ๋งž์ถฐ์ค˜์•ผ ๊ฒฐ๊ณผ๊ฐ€ ์ด์ƒํ•˜๊ฒŒ ์•ˆ ๋‚˜์™€!

๐Ÿ“ฒ Swift์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

.mlpackage ํŒŒ์ผ์„ Xcode ํ”„๋กœ์ ํŠธ์— ๋“œ๋ž˜๊ทธํ•˜๋ฉด, Xcode๊ฐ€ ํƒ€์ž…์ด ์ง€์ •๋œ Swift ํด๋ž˜์Šค๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ค˜. ์ด๊ฒŒ ์ง„์งœ ํŽธํ•ด. ์ด๋ฏธ์ง€ ์ž‘์—…์ด๋ผ๋ฉด Vision๊ณผ ์—ฎ์–ด์„œ ์“ฐ๋Š” ๊ฒŒ ์ •์„์ด์•ผ.

import Vision
import CoreML

let config = MLModelConfiguration()
config.computeUnits = .all   // CPU + GPU + Neural Engine

let coreModel = try MobileNetV3(configuration: config).model
let vnModel = try VNCoreMLModel(for: coreModel)

let request = VNCoreMLRequest(model: vnModel) { req, _ in
    guard let top = (req.results as? [VNClassificationObservation])?.first
    else { return }
    print("\(top.identifier): \(top.confidence)")
}
request.imageCropAndScaleOption = .centerCrop

let handler = VNImageRequestHandler(cgImage: cgImage)
try handler.perform([request])

computeUnits๋Š” .all, .cpuAndGPU, .cpuOnly, ๊ทธ๋ฆฌ๊ณ  iOS 16๋ถ€ํ„ฐ ์ƒ๊ธด .cpuAndNeuralEngine ์ค‘์— ๊ณ ๋ฅผ ์ˆ˜ ์žˆ์–ด. ๊ธฐ๋ณธ์€ .all์ด๊ณ , ๋Œ€๋ถ€๋ถ„ ์ด๊ฒŒ ์ œ์ผ ๋ฌด๋‚œํ•ด.

๐Ÿ› ๏ธ Xcode ์„ฑ๋Šฅ ๋ฆฌํฌํŠธ๋Š” ๊ผญ ์จ๋ด

Xcode 14๋ถ€ํ„ฐ ๋ชจ๋ธ ํŒŒ์ผ์„ ์—ด๋ฉด Performance ํƒญ์—์„œ ์—ฐ๊ฒฐ๋œ ๊ธฐ๊ธฐ์—์„œ์˜ ๋กœ๋“œ ์‹œ๊ฐ„, ์˜ˆ์ธก ์ง€์—ฐ ์‹œ๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์—ฐ์‚ฐ์ด CPU/GPU/ANE ์ค‘ ์–ด๋””์„œ ๋Œ์•˜๋Š”์ง€๊นŒ์ง€ ๋ณด์—ฌ์ค˜. "์™œ Neural Engine์„ ์•ˆ ํƒ€์ง€?" ์‹ถ์„ ๋•Œ ๋ฒ”์ธ์„ ์ฐพ๋Š” ๋ฐ ์ตœ๊ณ ์•ผ. Instruments์˜ Core ML ํ…œํ”Œ๋ฆฟ๋„ ๊ฐ™์ด ์“ฐ๋ฉด ๋ณ‘๋ชฉ์„ ์ •ํ™•ํžˆ ์žก์„ ์ˆ˜ ์žˆ์–ด.

๐Ÿค– 3. TensorFlow Lite โ†’ LiteRT: ์–ด๋””์„œ๋‚˜ ๋„๋Š” ๋งŒ๋Šฅ ์ผ๊พผ

TensorFlow Lite(TFLite)๋Š” ๊ตฌ๊ธ€์ด 2017๋…„ ๊ณต๊ฐœํ•œ ๋ชจ๋ฐ”์ผยท์ž„๋ฒ ๋””๋“œ์šฉ ๊ฒฝ๋Ÿ‰ ์ถ”๋ก  ํ”„๋ ˆ์ž„์›Œํฌ์•ผ. ๊ทธ๋ฆฌ๊ณ  ์ค‘์š”ํ•œ ์†Œ์‹! ๊ตฌ๊ธ€์€ 2024๋…„ 9์›”์— TFLite์˜ ์ด๋ฆ„์„ LiteRT(Lite Runtime)๋กœ ๋ฐ”๊ฟจ์–ด. TensorFlow๋งŒ์ด ์•„๋‹ˆ๋ผ PyTorch, JAX, Keras ๋ชจ๋ธ๋„ ํ’ˆ๋Š” "๋ฒ”์šฉ ์˜จ๋””๋ฐ”์ด์Šค ๋Ÿฐํƒ€์ž„"์ด ๋˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ง€.

โš ๏ธ ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง๊ธฐ
์ด๋ฆ„์€ ๋ฐ”๋€Œ์—ˆ์ง€๋งŒ .tflite ํŒŒ์ผ ํฌ๋งท์€ ๊ทธ๋Œ€๋กœ์•ผ. ๊ธฐ์กด TFLite ์ฝ”๋“œยท๋ชจ๋ธ๋„ ๊ณ„์† ๋™์ž‘ํ•˜๊ณ , ์ƒˆ ๊ธฐ๋Šฅ์€ LiteRT ํŒจํ‚ค์ง€ ์ชฝ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํ๋ฆ„์ด๋‹ˆ ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๊ณต์‹ LiteRT ๋ฌธ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋Š” ๊ฑธ ์ถ”์ฒœํ•ด.

๐ŸŒ ์žฅ์ : ํฌ๋กœ์Šคํ”Œ๋žซํผ

Core ML์ด ์• ํ”Œ ์ „์šฉ์ด๋ผ๋ฉด, LiteRT๋Š” Android, iOS, ๋ฆฌ๋ˆ…์Šค, macOS, ์›น, ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ(LiteRT for Microcontrollers)๊นŒ์ง€ ์•„์šธ๋Ÿฌ. ํ•˜๋‚˜์˜ .tflite ๋ชจ๋ธ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS ์–‘์ชฝ ์•ฑ์„ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ํฐ ๋ฌด๊ธฐ์•ผ.

๐Ÿš€ Delegate: ๊ฐ€์†๊ธฐ๋กœ ์ผ ๋„˜๊ธฐ๊ธฐ

TFLite์—๋Š” Delegate(๋ธ๋ฆฌ๊ฒŒ์ดํŠธ)๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์–ด. ๊ธฐ๋ณธ์€ CPU(XNNPACK ์ตœ์ ํ™” ์ปค๋„)๋กœ ๋Œ๊ณ , ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ๋ถ™์ด๋ฉด ์—ฐ์‚ฐ ์ผ๋ถ€ ํ˜น์€ ์ „์ฒด๋ฅผ ๊ฐ€์†๊ธฐ๋กœ ๋„˜๊ฒจ.

Delegate๋Œ€์ƒํŠน์ง•
XNNPACKCPU๊ธฐ๋ณธ ํ™œ์„ฑํ™”, ๋ถ€๋™์†Œ์ˆ˜ยท์–‘์žํ™” ๋ชจ๋‘ ๋น ๋ฆ„
GPU DelegateAndroidยทiOS GPUOpenGL ES/OpenCL/Metal ๊ธฐ๋ฐ˜, ํฐ ๋น„์ „ ๋ชจ๋ธ์— ์œ ๋ฆฌ
Core ML DelegateiOS (Neural Engine)iOS์—์„œ TFLite ๋ชจ๋ธ์„ ANE๋กœ ๊ฐ€์†
NNAPI DelegateAndroidAndroid 15๋ถ€ํ„ฐ NNAPI๊ฐ€ ์ง€์› ์ค‘๋‹จ(deprecated)๋˜์–ด ์‹ ๊ทœ ์‚ฌ์šฉ ๋น„๊ถŒ์žฅ
๋ฒค๋” NPUํ€„์ปดยท๋ฏธ๋””์–ดํ… ๋“ฑLiteRT๋Š” ์นฉ ๋ฒค๋” NPU ๊ฐ€์† ์—ฐ๋™์„ ํ™•๋Œ€ ์ค‘

๐Ÿ”„ ๋ณ€ํ™˜: TFLiteConverter ๊ธฐ๋ณธ๊ธฐ

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model("my_saved_model")
converter.optimizations = [tf.lite.Optimize.DEFAULT]  # ๋™์  ๋ฒ”์œ„ ์–‘์žํ™”
tflite_model = converter.convert()

with open("model.tflite", "wb") as f:
    f.write(tflite_model)

PyTorch ๋ชจ๋ธ์ด๋ผ๋ฉด? ๊ตฌ๊ธ€์ด ๋งŒ๋“  AI Edge Torch(Python ํŒจํ‚ค์ง€ ai-edge-torch)๋กœ PyTorch ๋ชจ๋ธ์„ ๋ฐ”๋กœ .tflite๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ์ „์ฒ˜๋Ÿผ ONNX โ†’ TF โ†’ TFLite๋กœ ์„ธ ๋ฒˆ ๊ฐˆ์•„ํƒ€๋Š” ๊ณ ์ƒ์ด ํฌ๊ฒŒ ์ค„์—ˆ์ง€.

๐Ÿ“ฒ Android(Kotlin)์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

val options = Interpreter.Options().apply {
    setNumThreads(4)
}
val interpreter = Interpreter(loadModelFile(context, "model.tflite"), options)

val input = Array(1) { Array(224) { Array(224) { FloatArray(3) } } }
val output = Array(1) { FloatArray(1000) }
interpreter.run(input, output)

val best = output[0].withIndex().maxBy { it.value }
Log.d("AI", "class=${best.index}, score=${best.value}")
๐Ÿ’ก Google Play services ๋Ÿฐํƒ€์ž„
์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋Š” TFLite ๋Ÿฐํƒ€์ž„์„ ์•ฑ์— ์ง์ ‘ ๋„ฃ๋Š” ๋Œ€์‹  Google Play ์„œ๋น„์Šค์— ํฌํ•จ๋œ ๋Ÿฐํƒ€์ž„์„ ์“ฐ๋Š” ๋ฐฉ์‹๋„ ์žˆ์–ด. ์•ฑ ์šฉ๋Ÿ‰์ด ์ค„๊ณ  ๋Ÿฐํƒ€์ž„ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€.

โš–๏ธ 4. ๊ทธ๋ž˜์„œ ๋ญ˜ ์จ์•ผ ํ•ด? ๋‘˜์˜ ๋น„๊ต

๐ŸŽ Core ML
โœ”๏ธ ์• ํ”Œ ๊ธฐ๊ธฐ์—์„œ Neural Engine ํ™œ์šฉ ์ตœ์ ํ™”
โœ”๏ธ Xcode ์ž๋™ ์ฝ”๋“œ ์ƒ์„ฑยท์„ฑ๋Šฅ ๋ฆฌํฌํŠธ
โœ”๏ธ VisionยทNL ๋“ฑ ์ƒ์œ„ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ฐฐ๋–ก
โœ”๏ธ Create ML๋กœ ๋…ธ์ฝ”๋“œ ํ•™์Šต ๊ฐ€๋Šฅ
โŒ ์• ํ”Œ ํ”Œ๋žซํผ ์ „์šฉ
๐Ÿค– TFLite / LiteRT
โœ”๏ธ AndroidยทiOSยท์›นยท์ž„๋ฒ ๋””๋“œ ํฌ๋กœ์Šคํ”Œ๋žซํผ
โœ”๏ธ ๋‹ค์–‘ํ•œ Delegate๋กœ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†
โœ”๏ธ MediaPipe ๋“ฑ ๊ตฌ๊ธ€ ์ƒํƒœ๊ณ„ ์—ฐ๊ณ„
โœ”๏ธ ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ๊นŒ์ง€ ์ง€์›
โŒ iOS์—์„œ๋Š” Core ML ๋Œ€๋น„ ANE ํ™œ์šฉ์ด ๊ฐ„์ ‘์ 

์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ๋Š” ๊ณต์‹์€ ์ด๋ž˜.

๐ŸŽฏ iOS ์ „์šฉ ์•ฑ โ†’ Core ML ์šฐ์„ 
๐ŸŽฏ Android ์ „์šฉ ์•ฑ โ†’ LiteRT(TFLite)
๐ŸŽฏ ์–‘์ชฝ ๋‹ค + ๊ฐ™์€ ๋ชจ๋ธ โ†’ ์›๋ณธ์„ PyTorch๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฐ๊ฐ Core ML / .tflite๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, FlutterยทReact Native์—์„œ TFLite ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ
๐ŸŽฏ ์–ผ๊ตดยท์†ยทํฌ์ฆˆ ๊ฐ™์€ ํ”ํ•œ ๊ธฐ๋Šฅ โ†’ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ ์ „์— Apple Vision, Google ML Kit, MediaPipe์˜ ์™„์„ฑ ์†”๋ฃจ์…˜๋ถ€ํ„ฐ ํ™•์ธ!

๐Ÿ—œ๏ธ 5. ๋‹ค์ด์–ดํŠธ์˜ ๊ธฐ์ˆ : ๋ชจ๋ธ ์ตœ์ ํ™”

๋ชจ๋ฐ”์ผ AI์˜ ํ•ต์‹ฌ์€ ๊ฒฐ๊ตญ "์ž‘๊ณ  ๋น ๋ฅด๊ฒŒ, ๊ทธ๋Ÿฐ๋ฐ ์ •ํ™•๋„๋Š” ์ตœ๋Œ€ํ•œ ์œ ์ง€"์•ผ. ๋Œ€ํ‘œ ๊ธฐ๋ฒ•์„ ๊ทธ๋ฆผ์œผ๋กœ ๋จผ์ € ๋ณด์ž.

์–‘์žํ™”์— ๋”ฐ๋ฅธ ๋ชจ๋ธ ํฌ๊ธฐ ๋ณ€ํ™” ๊ฐ€์ค‘์น˜ 1๊ฐœ๋‹น ๋น„ํŠธ ์ˆ˜ ๊ธฐ์ค€ (FP32 = 100%) FP32 100% FP16 50% INT8 25% INT4 12.5% โ€ป ์‹ค์ œ ํŒŒ์ผ ํฌ๊ธฐ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋“ฑ์œผ๋กœ ์•ฝ๊ฐ„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ

โ‘  ์–‘์žํ™”(Quantization)

32๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜ ๊ฐ€์ค‘์น˜๋ฅผ 16๋น„ํŠธ๋‚˜ 8๋น„ํŠธ, ์‹ฌ์ง€์–ด 4๋น„ํŠธ๋กœ ์ค„์ด๋Š” ๊ฑฐ์•ผ. INT8๋กœ๋งŒ ๋ฐ”๊ฟ”๋„ ๊ฐ€์ค‘์น˜ ํฌ๊ธฐ๊ฐ€ ์•ฝ 4๋ถ„์˜ 1์ด ๋ผ.

1
ํ•™์Šต ํ›„ ์–‘์žํ™”(PTQ): ์ด๋ฏธ ํ•™์Šต๋œ ๋ชจ๋ธ์„ ๋ณ€ํ™˜ ๋‹จ๊ณ„์—์„œ ์–‘์žํ™”. TFLite์˜ ๋™์  ๋ฒ”์œ„ยทFloat16ยท์™„์ „ ์ •์ˆ˜ ์–‘์žํ™”๊ฐ€ ์—ฌ๊ธฐ ์†ํ•ด. ์™„์ „ ์ •์ˆ˜ ์–‘์žํ™”์—” ๋Œ€ํ‘œ ๋ฐ์ดํ„ฐ์…‹(representative dataset)์ด ํ•„์š”ํ•ด.
2
์–‘์žํ™” ์ธ์‹ ํ•™์Šต(QAT): ํ•™์Šต ์ค‘์— ์–‘์žํ™” ํšจ๊ณผ๋ฅผ ํ‰๋‚ด ๋‚ด์„œ ์ •ํ™•๋„ ์†์‹ค์„ ์ตœ์†Œํ™”. ์†์ด ๋” ๊ฐ€์ง€๋งŒ ์ •ํ™•๋„ ๋ฐฉ์–ด๋ ฅ์ด ์ข‹์•„.

โ‘ก ๊ฐ€์ง€์น˜๊ธฐ(Pruning)ยทํŒ”๋ ˆํƒ€์ด์ œ์ด์…˜(Palettization)

์ค‘์š”๋„ ๋‚ฎ์€ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒŒ ๊ฐ€์ง€์น˜๊ธฐ, ๊ฐ€์ค‘์น˜ ๊ฐ’๋“ค์„ ์†Œ์ˆ˜์˜ ๋Œ€ํ‘œ๊ฐ’(๋ฃฉ์—… ํ…Œ์ด๋ธ”)์œผ๋กœ ๋ฌถ๋Š” ๊ฒŒ ํŒ”๋ ˆํƒ€์ด์ œ์ด์…˜์ด์•ผ. coremltools์˜ coremltools.optimize ๋ชจ๋“ˆ์ด ์ด๋Ÿฐ ์••์ถ• ๊ธฐ๋ฒ•๋“ค์„ ์ง€์›ํ•˜๊ณ , ์• ํ”Œ์€ ํŠนํžˆ ํŒ”๋ ˆํƒ€์ด์ œ์ด์…˜์„ Neural Engine ์นœํ™”์ ์ธ ์••์ถ•์œผ๋กœ ์ž์ฃผ ์†Œ๊ฐœํ•ด.

โ‘ข ์• ์ดˆ์— ๊ฐ€๋ฒผ์šด ๊ตฌ์กฐ ๊ณ ๋ฅด๊ธฐ

MobileNet, EfficientNet-Lite, YOLO ๊ณ„์—ด์˜ ๊ฒฝ๋Ÿ‰ ๋ฒ„์ „์ฒ˜๋Ÿผ ๋ชจ๋ฐ”์ผ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์ตœ์ ํ™”์˜ ์ ˆ๋ฐ˜์ด์•ผ. ๋ฌด๊ฑฐ์šด ๋ชจ๋ธ์„ ์–ต์ง€๋กœ ๊นŽ๋Š” ๊ฒƒ๋ณด๋‹ค ํšจ์œจ์ ์ผ ๋•Œ๊ฐ€ ๋งŽ๊ฑฐ๋“ .

โš ๏ธ ์–‘์žํ™” ํ›„์—” ๋ฐ˜๋“œ์‹œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋กœ ์ •ํ™•๋„๋ฅผ ์žฌ๊ฒ€์ฆํ•˜์ž! ํŠนํžˆ ์ž‘์€ ๋ชจ๋ธ์€ INT8์—์„œ ์ •ํ™•๋„๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด. ๋ฒค์น˜๋งˆํฌ ์ˆซ์ž๋ณด๋‹ค "๋‚ด ์•ฑ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์—์„œ์˜ ๊ฒฐ๊ณผ"๊ฐ€ ์ง„์‹ค์ด์•ผ.

๐Ÿงญ 6. ์˜จ๋””๋ฐ”์ด์Šค AI ์•ฑ ์ œ์ž‘ ์ „์ฒด ํ๋ฆ„

๋ชจ๋ธ์ด ์•ฑ์— ๋“ค์–ด๊ฐ€๊ธฐ๊นŒ์ง€ โ‘  ํ•™์Šต PyTorchยทTF โ‘ก ๋ณ€ํ™˜ mlpackageยทtflite โ‘ข ์ตœ์ ํ™” ์–‘์žํ™”ยท์••์ถ• โ‘ฃ ์•ฑ ํ†ตํ•ฉ ์ „์ฒ˜๋ฆฌยท์ถ”๋ก  โ‘ค ์‹ค๊ธฐ๊ธฐ ์ธก์ • ์†๋„ยท๋ฐœ์—ดยท์ •ํ™•๋„ โ‘ฅ ๋ฐฐํฌยท๊ฐœ์„  ๋ชจ๋ธ ์—…๋ฐ์ดํŠธ

๊ฐ ๋‹จ๊ณ„์—์„œ ๋†“์น˜๊ธฐ ์‰ฌ์šด ํฌ์ธํŠธ๋ฅผ ์งš์–ด๋ณผ๊ฒŒ.

1
๋ฌธ์ œ ์ •์˜๋ถ€ํ„ฐ ์ž‘๊ฒŒ
"๋ชจ๋“  ๊ฑธ ๋‹ค ํ•˜๋Š” AI"๋ณด๋‹ค "์Œ์‹ ์‚ฌ์ง„ 10์ข… ๋ถ„๋ฅ˜"์ฒ˜๋Ÿผ ๋ฒ”์œ„๋ฅผ ์ขํž์ˆ˜๋ก ์ž‘์€ ๋ชจ๋ธ๋กœ๋„ ๋†’์€ ์ •ํ™•๋„๊ฐ€ ๋‚˜์™€.
2
์ „์ฒ˜๋ฆฌ ์ผ์น˜์‹œํ‚ค๊ธฐ
ํ•™์Šต ๋•Œ์˜ ๋ฆฌ์‚ฌ์ด์ฆˆ ๋ฐฉ์‹, ์ƒ‰์ƒ ์ฑ„๋„ ์ˆœ์„œ(RGB/BGR), ์ •๊ทœํ™” ๊ฐ’์ด ์•ฑ์—์„œ๋„ ๋˜‘๊ฐ™์•„์•ผ ํ•ด. ์˜จ๋””๋ฐ”์ด์Šค AI ๋ฒ„๊ทธ์˜ ์ƒ๋‹น์ˆ˜๊ฐ€ ์—ฌ๊ธฐ์„œ ๋‚˜์™€.
3
๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๊ธˆ์ง€
์ถ”๋ก ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ! UI๊ฐ€ ๋ฉˆ์ถ”๋ฉด ์‚ฌ์šฉ์ž๋Š” AI๊ฐ€ ๋˜‘๋˜‘ํ•œ์ง€ ๋”ฐ์ง€๊ธฐ ์ „์— ์•ฑ์„ ๊บผ๋ฒ„๋ ค.
4
๋ชจ๋ธ์€ ํ•œ ๋ฒˆ๋งŒ ๋กœ๋“œ
๋ชจ๋ธ ๋กœ๋”ฉ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋น„์‹ธ. ํŠนํžˆ Core ML์€ ์ฒซ ๋กœ๋“œ ๋•Œ ๊ธฐ๊ธฐ๋ณ„ ์ปดํŒŒ์ผยทํŠน์ˆ˜ํ™”๊ฐ€ ์ผ์–ด๋‚˜์„œ ๋А๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜์ž.
5
๊ตฌํ˜• ๊ธฐ๊ธฐ์—์„œ ์ธก์ •
์ตœ์‹  ํ”Œ๋ž˜๊ทธ์‹ญ์—์„œ 30ms๋ฉด 3~4๋…„ ๋œ ๋ณด๊ธ‰ํ˜•์—์„  ๋ช‡ ๋ฐฐ ๋А๋ฆด ์ˆ˜ ์žˆ์–ด. ํƒ€๊นƒ ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ ๋ถ„ํฌ๋ฅผ ๊ผญ ๊ณ ๋ คํ•ด.
6
๋ชจ๋ธ ์—…๋ฐ์ดํŠธ ์ „๋žต
์•ฑ ์—…๋ฐ์ดํŠธ ์—†์ด ๋ชจ๋ธ๋งŒ ๊ต์ฒดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, iOS๋Š” ๋ชจ๋ธ์„ ๋‚ด๋ ค๋ฐ›์•„ MLModel.compileModel(at:)๋กœ ๊ธฐ๊ธฐ์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ์‹์ด, ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” Firebase ๋“ฑ์„ ํ†ตํ•œ ์›๊ฒฉ ๋ชจ๋ธ ๋ฐฐํฌ ๋ฐฉ์‹์ด ์žˆ์–ด.

๐Ÿง  7. ์š”์ฆ˜ ํ•ซํ•œ ์ด์•ผ๊ธฐ: ํฐ์—์„œ ๋Œ์•„๊ฐ€๋Š” ์ƒ์„ฑํ˜• AI

๋ช‡ ๋…„ ์ „๋งŒ ํ•ด๋„ "ํฐ์—์„œ LLM ๋Œ๋ฆฌ๊ธฐ"๋Š” ๋†๋‹ด ๊ฐ™์•˜๋Š”๋ฐ, ์ง€๊ธˆ์€ ํ˜„์‹ค์ด์•ผ.

๐Ÿ ์• ํ”Œ ์ชฝ
Core ML์€ ์ƒํƒœ ์œ ์ง€ ๋ชจ๋ธ(stateful model)๋กœ LLM์˜ KV ์บ์‹œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋Šฅ, 4๋น„ํŠธ ๋“ฑ ์ €๋น„ํŠธ ์••์ถ• ๊ฐ™์€ ์ƒ์„ฑํ˜• ๋ชจ๋ธ ์นœํ™” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์™”์–ด. ๋˜ Apple Intelligence์˜ ์˜จ๋””๋ฐ”์ด์Šค ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ์•ฑ์—์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” Foundation Models ํ”„๋ ˆ์ž„์›Œํฌ๋„ ๋ฐœํ‘œํ–ˆ์ง€(์ง€์› ๊ธฐ๊ธฐยทOS ์กฐ๊ฑด์ด ์žˆ์–ด). Apple Silicon Mac์—์„œ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ฐฐ์—ด ํ”„๋ ˆ์ž„์›Œํฌ MLX๋กœ LLM์„ ๋Œ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๋„ ๋งŽ์•„.

๐Ÿค– ๊ตฌ๊ธ€ ์ชฝ
์•ˆ๋“œ๋กœ์ด๋“œ์—๋Š” ์‹œ์Šคํ…œ ์ˆ˜์ค€ ์˜จ๋””๋ฐ”์ด์Šค ๋ชจ๋ธ Gemini Nano๊ฐ€ ์žˆ๊ณ (์ง€์› ๊ธฐ๊ธฐ ํ•œ์ •), ์˜คํ”ˆ ๋ชจ๋ธ(Gemma ๋“ฑ)์„ LiteRT ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐ๊ธฐ์—์„œ ๋Œ๋ฆฌ๋Š” MediaPipe LLM Inference API ๊ฐ™์€ ๋„๊ตฌ๋„ ์ œ๊ณต๋˜๊ณ  ์žˆ์–ด.

๋‹ค๋งŒ LLM์€ ์ˆ˜์–ต~์ˆ˜์‹ญ์–ต ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌยท์ €์žฅ ๊ณต๊ฐ„ยท๋ฐœ์—ด์ด ์ผ๋ฐ˜ ๋น„์ „ ๋ชจ๋ธ๊ณผ ์ฐจ์›์ด ๋‹ฌ๋ผ. "๋ชจ๋“  ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์—์„œ ๋Œ์•„๊ฐ€๋‚˜?"๋ฅผ ๊ผญ ํ™•์ธํ•˜๊ณ , ๋ฏธ์ง€์› ๊ธฐ๊ธฐ๋ฅผ ์œ„ํ•œ ๋Œ€์ฒด ๊ฒฝ๋กœ(์„œ๋ฒ„ ํ˜ธ์ถœ ๋“ฑ)๋ฅผ ์„ค๊ณ„ํ•ด๋‘๋Š” ๊ฒŒ ์•ˆ์ „ํ•ด.

๐Ÿ’ก 8. ์ด๋Ÿฐ ์•ฑ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ์–ด!

์‚ฌ๋ฌผ ์ธ์‹ ์ž์„ธ ๋ถ„์„ ๋ฌธ์ž ์ธ์‹ ์Œ์„ฑยท์†Œ๋ฆฌ ๋ชจ๋‘ ๋„คํŠธ์›Œํฌ ์—†์ด ๊ธฐ๊ธฐ์—์„œ ๋™์ž‘ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ๋“ค
๐Ÿฅ— ์นผ๋กœ๋ฆฌ ๊ธฐ๋ก ์•ฑ
์Œ์‹ ์‚ฌ์ง„ ๋ถ„๋ฅ˜ + ์˜์–‘ ์ •๋ณด ๋งค์นญ
๐Ÿ‹๏ธ ํ™ˆํŠธ ์ž์„ธ ์ฝ”์น˜
ํฌ์ฆˆ ์ถ”์ •์œผ๋กœ ์Šค์ฟผํŠธ ๊ฐœ์ˆ˜ยท์ž์„ธ ์ฒดํฌ
๐Ÿงพ ์˜์ˆ˜์ฆ ์ •๋ฆฌ ์•ฑ
๋ฌธ์ž ์ธ์‹(OCR)์œผ๋กœ ๊ฐ€๊ณ„๋ถ€ ์ž๋™ ์ž…๋ ฅ
๐ŸŒฟ ์‹๋ฌผ ๋„๊ฐ ์•ฑ
๋“ฑ์‚ฐ ์ค‘ ์˜คํ”„๋ผ์ธ์œผ๋กœ ๊ฝƒยท๋‚˜๋ฌด ํŒ๋ณ„

์ด๋Ÿฐ ์•„์ด๋””์–ด๋Š” ์žˆ๋Š”๋ฐ ๋ชจ๋ธ ํ•™์Šต์ด๋‚˜ ์•ฑ ๊ฐœ๋ฐœ ์ค‘ ํ•œ์ชฝ์ด ๋ง‰ํžŒ๋‹ค๋ฉด? ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ์žฌ๋Šฅ ๊ณต์œ  ํ”Œ๋žซํผ์—์„œ iOSยท์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž๋‚˜ ๋จธ์‹ ๋Ÿฌ๋‹ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์•„ MVP๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒƒ๋„ ํ˜„์‹ค์ ์ธ ๋ฐฉ๋ฒ•์ด์•ผ. ํ˜ผ์ž ๋™๋™๋Œ€๋Š” ์‹œ๊ฐ„๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅผ ์ˆ˜ ์žˆ๊ฑฐ๋“  ๐Ÿ˜‰

๐Ÿงฏ 9. ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ํ•จ์ • TOP 5

์ฆ์ƒํ”ํ•œ ์›์ธ์ฒ˜๋ฐฉ
๊ฒฐ๊ณผ๊ฐ€ ์—‰๋šฑํ•จ์ „์ฒ˜๋ฆฌ ๋ถˆ์ผ์น˜ํ•™์Šต ์ฝ”๋“œ์˜ ์ •๊ทœํ™”ยท์ฑ„๋„ ์ˆœ์„œ ์žฌํ™•์ธ
๋ณ€ํ™˜ ์‹คํŒจ๋ฏธ์ง€์› ์—ฐ์‚ฐ(op)๋ชจ๋ธ ๊ตฌ์กฐ ์ˆ˜์ •, TFLite Select TF ops, ์ตœ์‹  ๋ณ€ํ™˜๊ธฐ ์‚ฌ์šฉ
๊ฐ€์†๊ธฐ๋ฅผ ์•ˆ ํƒ๊ฐ€์†๊ธฐ ๋ฏธ์ง€์› ๋ ˆ์ด์–ดXcode ์„ฑ๋Šฅ ๋ฆฌํฌํŠธยทLiteRT ๋ฒค์น˜๋งˆํฌ ๋„๊ตฌ๋กœ ํ™•์ธ
์ฒซ ์‹คํ–‰์ด ๋А๋ฆผ๋ชจ๋ธ ์ปดํŒŒ์ผยท์ดˆ๊ธฐํ™”์•ฑ ์‹œ์ž‘ ์‹œ ๋ฏธ๋ฆฌ ๋กœ๋“œ(์›Œ๋ฐ์—…)
ํฐ์ด ๋œจ๊ฑฐ์›Œ์ง๋งค ํ”„๋ ˆ์ž„ ๋ฌด๋ฆฌํ•œ ์ถ”๋ก ์ถ”๋ก  ์ฃผ๊ธฐ ์กฐ์ ˆ, ํ•ด์ƒ๋„ ์ถ•์†Œ, ๊ฒฝ๋Ÿ‰ ๋ชจ๋ธ ์„ ํƒ

๐ŸŽ ๋งˆ๋ฌด๋ฆฌ: ํ•ต์‹ฌ๋งŒ ์„ธ ์ค„ ์š”์•ฝ

1๏ธโƒฃ ์˜จ๋””๋ฐ”์ด์Šค AI = ํ”„๋ผ์ด๋ฒ„์‹œยท์†๋„ยท์˜คํ”„๋ผ์ธยท๋น„์šฉ, ๋„ค ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๋Š” ๋ฐฉ๋ฒ•.
2๏ธโƒฃ Core ML์€ ์• ํ”Œ ๊ธฐ๊ธฐ์˜ Neural Engine์„ ๊ฐ€์žฅ ์ž˜ ์“ฐ๋Š” ๊ณต์‹ ๋ฃจํŠธ, LiteRT(๊ตฌ TFLite)๋Š” ์–ด๋””์„œ๋‚˜ ๋„๋Š” ํฌ๋กœ์Šคํ”Œ๋žซํผ ๋ฃจํŠธ.
3๏ธโƒฃ ์„ฑ๊ณต์˜ ์—ด์‡ ๋Š” ์ž‘์€ ๋ฌธ์ œ ์ •์˜ + ์ „์ฒ˜๋ฆฌ ์ผ์น˜ + ์–‘์žํ™” + ์‹ค๊ธฐ๊ธฐ ์ธก์ •!

์ฒ˜์Œ์—” MobileNet ๊ฐ™์€ ๊ณต๊ฐœ ๋ชจ๋ธ ํ•˜๋‚˜ ๋ณ€ํ™˜ํ•ด์„œ ์นด๋ฉ”๋ผ์— ๋ถ™์—ฌ๋ณด๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ด. ํ™”๋ฉด์— "๊ณ ์–‘์ด 97%"๊ฐ€ ์ฒ˜์Œ ๋œจ๋Š” ์ˆœ๊ฐ„, ์ง„์งœ ์งœ๋ฆฟํ•˜๊ฑฐ๋“  ๐Ÿฑโœจ
์žฌ๋Šฅ๋„ท ์ง€์‹์ธ์˜ ์ˆฒ์—์„œ ๋‹ค์Œ์—๋„ ์žฌ๋ฐŒ๋Š” ๊ฐœ๋ฐœ ์ด์•ผ๊ธฐ๋กœ ๋˜ ๋งŒ๋‚˜์ž!

์ฐธ๊ณ  ์ž๋ฃŒ
ยท Apple Developer โ€“ Core ML: https://developer.apple.com/documentation/coreml
ยท coremltools ๊ณต์‹ ๋ฌธ์„œ: https://apple.github.io/coremltools/docs-guides/
ยท Google AI Edge โ€“ LiteRT ๊ฐœ์š”: https://ai.google.dev/edge/litert
ยท Google Developers Blog โ€“ "TensorFlow Lite is now LiteRT"(2024): https://developers.googleblog.com/en/tensorflow-lite-is-now-litert/
ยท AI Edge Torch (GitHub): https://github.com/google-ai-edge/ai-edge-torch
ยท Android Developers โ€“ NNAPI ์ง€์› ์ค‘๋‹จ ์•ˆ๋‚ด: https://developer.android.com/ndk/guides/neuralnetworks/migration-guide
ยท โ€ป ๋ฒ„์ „ยท์ง€์› ๊ธฐ๊ธฐ ์ •๋ณด๋Š” ์ˆ˜์‹œ๋กœ ๋ฐ”๋€Œ๋ฏ€๋กœ ๊ฐœ๋ฐœ ์ „ ๊ณต์‹ ๋ฌธ์„œ์˜ ์ตœ์‹  ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”.

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.