Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android端末で実現するオンデバイスLLM 2025

Avatar for Masayuki Suda Masayuki Suda
September 10, 2025

Android端末で実現するオンデバイスLLM 2025

DroidKaigi 2025で発表させていただいたSlideです。
サンプルコードはこちらです。
https://github.com/MasayukiSuda/DroidKaigiLocalLLMSample

Avatar for Masayuki Suda

Masayuki Suda

September 10, 2025
Tweet

More Decks by Masayuki Suda

Other Decks in Programming

Transcript

  1. ໨࣍ 01. ΠϯτϩμΫγϣϯ 04. ࣮༻ੑൺֱɾ·ͱΊ 02. ࣮૷ํ๏ɾϝϦοτσϝϦοτ 03. Benchmark ɾࣗݾ঺հ

    ɾηογϣϯ֓ཁ ɾ༻ޠղઆ ɾ࣮༻ੑൺֱ ɾ·ͱΊ ɾOn Device LLMಋೖྫ ɾGemini Nano ɾLlama.cpp ɾMediaPipe LLM Inference API ɾձ࿩ ɾཁ໿ ɾߍਖ਼
  2. ຊηογϣϯͰѻ͏3ͭͷΞϓϩʔν 1. Gemini Nano with the Google AI Edge SDK

    - GoogleͷΦϯσόΠεAI 2. Llama.cpp - ྔࢠԽLLMͷωΠςΟϒ࣮ߦ 3. MediaPipe LLM Inference API (.task) - LiteRTϕʔεͷߴϨϕϧLLM API
  3. AIɾػցֶशͷجຊ༻ޠ **LLMʢLarge Language Modelʣ** େن໛ݴޠϞσϧ - େྔͷςΩετͰֶशͨ͠AI **ਪ࿦ʢInferenceʣ** AI͕ೖྗΛड͚ͯ౴͑Λग़͢͜ͱ= ΞϓϦͰ͍͏ʮॲཧʯ΍ʮܭࢉʯ

    **τʔΫϯʢTokenʣ** AI͕ཧղ͢ΔςΩετͷ࠷খ୯Ґ ྫ: ʮ͜Μʹͪ͸ʯˠ ʮ͜Μʯʮʹͪʯʮ͸ʯ **ϨΠςϯγʢLatencyʣ** Ԡ౴࣌ؒ = ωοτϫʔΫ௨৴ͷ஗Ԇͱಉ֓͡೦
  4. Gemini Nano֓ཁ • GoogleͷΦϯσόΠεੜ੒AI • aicore-experimental Google άϧʔϓʹࢀՃ͠ɺAndroid AICore ςετ

    ϓ ϩάϥϜʹΦϓτΠϯ͢Δ • AICore αʔϏεܦ༝ͰΞΫηε • ରԠ୺຤ɿPixel 9γϦʔζ
  5. Gemini Nano ϝϦοτɾσϝϦοτ ϝϦοτɿ • ߴ͍ਪ࿦඼࣭ʢ࠷৽ͷGeminiٕज़ʣ • ετϦʔϛϯάੜ੒αϙʔτ • OSϨϕϧͰͷ࠷దԽ

    • GoogleΤίγεςϜ౷߹ σϝϦοτɿ • ରԠ୺຤͕ݶఆత • ΧελϚΠζੑ੍͕ݶత • ࣮ݧతػೳͰ·ͩҰൠར༻͕Ͱ͖ͳ͍ɻ • ճ౴͕҆ఆͤͣɺ๫૸͢Δ͜ͱ͕͋Δ
  6. Llama.cpp Ϟσϧͷબ୒ࢶ ར༻ՄೳϞσϧྫɿ • TinyLlama 1.1B Q4: 640MBʢܰྔςετ༻ʣ • Llama

    3.2 3B Q4_K_M: 2.3GBʢਪ঑ʣ • Qwen2.5 3B: 2GBʢଟݴޠରԠʣ • Phi-3.5 Mini: 2.2GBʢվྑ൛ʣ • Llama 3.2 1B Instruct Q4_K_M: 891MBʢߴ଎Ԡ౴ʣ
  7. Llama.cpp ϝϦοτɹσϝϦοτ ϝϦοτɿ • ๛෋ͳϞσϧબ୒ࢶ • ߴ౓ͳΧελϚΠζੑ • ΫϩεϓϥοτϑΥʔϜ •

    ΞΫςΟϒͳίϛϡχςΟ • Φʔϓϯιʔε σϝϦοτɿ ɾϞσϧຖʹLicense͕ҟͳΔ ɾCPUґଘ
  8. MediaPipe Tasks Inference APIɹ֓ཁ • LiteRT (چTensorFlow Lite) ্Ͱಈ࡞ •

    GemmaϑΝϛϦʔ (.taskܗࣜ) ਪ঑ • LLMಛԽͷߴϨϕϧAPI • NNAPI / GPUਪ࿦ରԠ • ϞόΠϧ୺຤޲͚࠷దԽ
  9. MediaPipe Tasks Inference APIɹϞσϧͷબ୒ࢶ • Gemma3 270M: 304MBʢ࠷ܰྔʣ • Gemma3

    1B: 554MBʢߴੑೳɾਪ঑ʣ • Gemma3 NANO 2B: 3GBʢ࠷ߴੑೳʣ
  10. MediaPipe Tasks Inference API ϝϦοτɹσϝϦοτ ϝϦοτɿ • ߴϨϕϧAPIʹΑΔ؆୯ͳ࣮૷ • LiteRTϕʔεͷߴੑೳ

    • GPU/NNAPI׆༻ • GoogleΤίγεςϜ • ܧଓతαϙʔτ σϝϦοτɿ • ΧελϚΠζͷ෯͕ڱ͍
  11. ൺֱ߲໨ Gemini Nano Llama.cpp ʢLlama 3.2 1B Instruct Q4ʣ MediaPipe

    LLM ඼࣭ɾλεΫୡ੒౓ ˕ ⚪︎ ▲ ฏۉϝϞϦ࢖༻ྔ 148MB 1,072MB 826MB ॳճτʔΫϯੜ੒࣌ؒ 298ms 798ms 560ms ૯τʔΫϯੜ੒࣌ؒ 64,963ms 91,054ms 20,357ms όοςϦʔফඅ 0.51% 1% 0.5% Benchmark ձ࿩ͷ݁Ռ
  12. Gemini ձ࿩ɾճ౴ྫʢྑ͍ͱ͖ʣ MVVMύλʔϯͱ͸ MVVMʢModel-View-ViewModelʣύλʔϯ͸ɺΞϓϦ։ൃͷΞʔΩςΫνϟύλʔϯͷҰͭͰ͢ɻΞϓϦΛେ͖͘෼͚ͯModelɺViewɺViewModelͷ3ͭͷίϯ ϙʔωϯτʹ෼͚Δ͜ͱͰɺ։ൃͷޮ཰ԽɺϞδϡʔϧԽɺςεςΟϯά͠΍͢͞Λ࣮͠·͢ɻ **Model:** σʔλͷιʔεͱঢ়ଶΛද͢ΫϥεͰ͢ɻσʔλϕʔεɺAPIɺ·ͨ͸֎෦Ϧιʔε͔ΒσʔλΛϩʔυ͠ɺϞσϧͷঢ়ଶΛߋ৽͠·͢ɻ **View:** ΞϓϦͷϢʔβʔΠϯλʔϑΣʔεɺϢʔβʔ͔ΒͷೖྗΛॲཧ͢ΔΫϥεͰ͢ɻϞσϧͷঢ়ଶʹج͍ͮͯϢʔβʔΠϯλʔϑΣʔεΛϨϯμϦϯά͠ɺ Ϣʔβʔ͔ΒͷೖྗΛॲཧ͠·͢ɻ

    **ViewModel:** ViewͱModelͷ஥հऀΫϥεͰ͢ɻViewModel͸ɺViewͷૢ࡞ʹΑͬͯModelͷঢ়ଶ͕มԽ͢ΔΠϕϯτΛड͚औΓɺ͜ΕΒͷΠϕϯτʹΑͬͯ Modelͷঢ়ଶΛߋ৽͠·͢ɻ·ͨɺViewModel͸ɺϢʔβʔͷೖྗΛجʹView͕ϨϯμϦϯά͢Δඞཁ͕͋Δ৘ใΛఏڙ͠·͢ɻ ## MVVMύλʔϯΛ࢖͏ར఺ **1. ϞδϡʔϧԽͱςεςΟϯάͷ͠΍͢͞:** MVVMύλʔϯͰ͸ɺModelɺViewɺViewModelΛͦΕͧΕಠཱͨ͠ίϯϙʔωϯτͱͯ͠ѻ͏͜ͱ͕Ͱ͖·͢ɻ͜Ε͸ɺϞδϡʔϧԽΛଅਐ͠ɺ։ൃͷޮ཰Λߴ Ί·͢ɻ·ͨɺViewͱModelΛ௚઀ΞΫηεͤͣʹViewModelΛ௨ͯ͠ૢ࡞͢Δ͜ͱͰɺςεςΟϯάͷ͠΍͢͞΋޲্͠·͢ɻViewͱModelΛ௚઀ΞΫηε͢Δ ͱɺςεςΟϯά͕ෳࡶʹͳΓɺόάͷमਖ਼΋೉͘͠ͳΓ·͢ɻViewModelΛ௨ͯ͠ૢ࡞͢Δ͜ͱͰɺViewͱModelͷ૬ޓ࡞༻Λςετ͠΍͍͢Α͏ʹ͠·͢ɻ AndroidΞϓϦ։ൃͰMVVMύλʔϯΛ࢖͏ར఺ʹ͍ͭͯৄ͘͠આ໌͍ͯͩ͘͠͞ɻ
  13. Llama ձ࿩ɾճ౴ྫ ### MVVMύλʔϯ MVVMύλʔϯ͸ɺModel-View-ViewModelͷόʔδϣϯͰ͢ɻ - Model:σʔλΛ؅ཧ͢ΔΫϥε - View:UIΛදࣔ͢ΔΫϥε -

    ViewModel:σʔλΛ؅ཧ͠ɺUIʹม׵͢ΔΫϥε ### AndroidΞϓϦͰMVVMύλʔϯΛ࢖༻͢Δར఺ 1. **σʔλ؅ཧͷ؆ૉԽ**: MVVMύλʔϯͰ͸ɺσʔλΛ؅ཧ͢ΔΫϥεͱσʔλΛ؅ཧ͢ΔΫϥεΛ෼཭͢Δ͜ͱͰɺσʔλ؅ཧ͕؆ૉԽ͞Ε·͢ɻ 2. **UIͷ੍ޚ**: ViewModelΫϥε͸ɺUIʹม׵͢Δ͜ͱͰɺUIͷ੍ޚ͕؆ૉԽ͞Ε·͢ɻ 3. **σʔλͷ҆શੑ**: ViewModelΫϥε͸ɺσʔλͷ҆શੑΛ֬อ͢Δ͜ͱͰɺσʔλͷ҆શੑ͕ߴ·Γ·͢ɻ 4. **ϩδοΫͷ෼ࢄ**: ViewModelΫϥε͸ɺϩδοΫͷ෼ࢄΛՄೳʹ͠ɺίʔυΛ؆ૉԽ͠·͢ɻ 5. **ςετͷ༰қੑ**: ViewModelΫϥε͸ɺςετ͕༰қʹͳΓɺίʔυͷςετ͕؆ૉԽ͞Ε·͢ɻ 6. **σόΠεͷޓ׵ੑ**: MVVMύλʔϯͰ͸ɺσʔλΛ؅ཧ͢ΔΫϥεͱσʔλΛ؅ཧ͢ΔΫϥεΛ෼཭͢Δ͜ͱͰɺσόΠεͷޓ׵ੑ͕ߴ·Γ·͢ɻ ### AndroidΞϓϦͰMVVMύλʔϯΛ࢖༻͢Δ৔߹ 1. **ModelΫϥεΛViewModelΫϥεʹม׵**: ModelΫϥεΛViewModelΫϥεʹม׵͢Δ͜ͱͰɺσʔλ؅ཧͷ؆ૉԽ͕ՄೳʹͳΓ·͢ɻ 2. **ViewModelΫϥεΛViewΫϥεʹม׵**: ViewModelΫϥεΛViewΫϥεʹม׵͢Δ͜ͱͰɺUIͷ੍ޚ͕؆ૉԽ͞Ε·͢ɻ 3. **ViewModelΫϥεΛRepositoryΫϥεʹม׵**: RepositoryΫϥεΛViewModelΫϥεʹม׵͢Δ͜ͱͰɺσʔλͷ҆શੑ͕ߴ·Γ·͢ɻ AndroidΞϓϦ։ൃͰMVVMύλʔϯΛ࢖͏ར఺ʹ͍ͭͯৄ͘͠આ໌͍ͯͩ͘͠͞ɻ
  14. MediaPipe LLM Inference APIɾճ౴ྫ AndroidΞϓϦ։ൃͰMVVMύλʔϯΛ࢖͏্Ͱͷར఺Λపఈతʹઆ໌͠·͢ʂ MVVMʢModel-View-ViewModelʣύλʔϯ͸ɺAndroidΞϓϦ։ൃʹ͓͍ͯɺUIཁૉͱͷؔ܎ੑΛؒ઀తʹɺΑΓॊೈ͔ͭޮ཰తʹ؅ཧ͢ΔͨΊͷΞʔΩ ςΫνϟύλʔϯͰ͢ɻ͔͠͠ɺMVVMΛ࢖͏্Ͱͷར఺͸ଟذʹ౉Γ·͢ɻ **MVVM Patternsͷར఺ -

    ͜ͷ1͔ͭΒ10ͭ·Ͱઆ໌͠·͢ɿ** 1. **UI\/UX ͷ෼཭:** * MVVMύλʔϯʹΑͬͯɺUIʢϢʔβʔΠϯλʔϑΣʔεʣͰѻ͏΂͖ॲཧΛɺViewModelͰ෼཭͠·͢ɻ * ViewModel͸ɺσʔλॲཧΛ͢Δ͚ͩͰɺUIཁૉʢView)ʹ௚઀ׯব͢ΔͷͰ͸ͳ͘ɺσʔλͰσʔλΛॲཧ͠·͢ * ͜ΕʹΑΓɺUI\/UXͷมߋʹΑͬͯɺViewModelΛมߋ͢Δ͚ͩͰɺUI͕ಈతʹߋ৽͞Ε·͢ * ͜Ε͸ɺUI\/UXΛΑΓॊೈʹɺ؆୯ʹมߋͰ͖ΔϝϦοτ͕͋Γ·͢ 2. **σʔλۦಈ:** * ViewModel͸ɺσʔλͷ४උɺॲཧɺͦͯ͠σʔλͷ੔߹ੑΛ୲౰͠·͢ * ViewModelͰॲཧΛ؅ཧͰ͖Ε͹ɺUI\/UXͷมߋʹ2ճɺ2ഒɺ͞Βʹ2ഒͷॲཧΛߦ͏ඞཁ͕͋Γ·ͤΜ * ͞ΒʹɺViewModelͰσʔλΛॲཧ͢Δ͜ͱ͕Ͱ͖Ε͹ɺUI\/UXΛ2ճɺ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒͷॲཧΛॲཧ͢Δඞཁ͕͋Γ·ͤΜ * ͜Ε͸ɺίʔυͷมߋΛ2ճɺ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Β ʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ͞Βʹ2ഒɺ AndroidΞϓϦ։ൃͰMVVMύλʔϯΛ࢖͏ར఺ʹ͍ͭͯৄ͘͠આ໌͍ͯͩ͘͠͞ɻ
  15. Benchmark ൺֱ߲໨ Gemini Nano Llama.cpp Suzume-llama-3-8B-japanese MediaPipe LLM ඼࣭ɾλεΫୡ੒౓ ˕

    ˕ ˕ ฏۉϝϞϦ࢖༻ྔ 149MB 4,558MB 832MB ॳճτʔΫϯੜ੒࣌ؒ 376ms 18,578ms 2,445ms ૯τʔΫϯੜ੒࣌ؒ 11,489ms 113,192ms 4,246ms όοςϦʔফඅ 0.11% 1% 0.01% ཁ໿ͷ݁Ռ
  16. Benchmark ൺֱ߲໨ Gemini Nano Llama.cpp Suzume-llama-3-8B-japanese MediaPipe LLM ඼࣭ɾλεΫୡ੒౓ ⚪︎

    ˕ ⚪︎ ฏۉϝϞϦ࢖༻ྔ 168MB 4,261MB 846MB ॳճτʔΫϯੜ੒࣌ؒ 381ms 16,268ms 2,144ms ૯τʔΫϯੜ੒࣌ؒ 7,531ms 169,355ms 2,145ms όοςϦʔফඅ 0.05% 1% 0.01% ߍਖ਼ͷ݁Ռ
  17. Llama ߍਖ਼ɾճ౴ྫ ग़ྗ: ࢲ͸ࠓ೔ɺ͋ͨΒ͍͠ຊΛങ͍·ͨ͠ɻͱͯ΋ڵຯਂ͍಺༰ͰɺҰؾʹಡΜͰ͠·͍·ͨ͠ɻ ղઆ: - ʮΘʯ͸ɺจ๏্ͷޡΓͰ͋Γɺলུܗͱͯ͠͸ʮ͸ʯ΍ʮΛʯͳͲ͕࢖ΘΕΔ͕ɺʮΘʯ͸ਖ਼͠ ͍จ๏Ͱ͸࢖ΘΕͳ͍ͨΊɺਖ਼֬ͳදݱʹ͸ؚΊͳ͍ɻ - ʮ·ͨʯ͸ɺจ຺ʹΑͬͯ͸ʮ·ͨʯ͕ҙຯΛม͑Δ͜ͱ͕͋Δ͕ɺ͜͜Ͱ͸ʮ·ͨʯ͕ʮ͞Βʹʯ

    ΍ʮ·ͨͯ͠΋ʯͳͲͷҙຯΛࣔ͢͜ͱ͸ͳ͍ͨΊɺจ຺͔Βʮ·ͨʯ͕ʮ͞Βʹʯ΍ʮ·ͨͯ͠΋ʯ ͳͲͷҙຯΛࣔ͢৔߹ʹͷΈ࢖༻͢Δͷ͕ҰൠతͰ͋Δɻ͜͜Ͱ͸ʮ·ͨʯ͕ʮ͞Βʹʯ΍ʮ·ͨ͠ ͯ΋ʯͳͲͷҙຯΛ͍ࣔͯ͠ͳ͍ͨΊɺਖ਼֬ͳදݱʹ͸ؚΊͳ͍ɻ ࢲΘࠓ೔ɺ͋ͨΒ͍͠ຊΛങ͍·ͨɻͱͯ΋ڵຯਂ͍಺༰ͰɺҰؾʹಡΜͰ͠·͍·ͨɻ
  18. ࣮༻ੑൺֱ ൺֱ߲໨ Gemini Nano Llama.cpp MediaPipe LLM Ԡ౴඼࣭ ύʔϑΣΫτ ͨͩͨ͠·ʹ๫૸

    Modelʹࠨӈ͞ΕΔ͕ ֓Ͷ ⚪︎ ཁ໿ɺߍਖ਼͸˕ ձ࿩͸ݶఆత latency ˕ ⚪︎ ⚪︎ ରԠ୺຤ ݶఆత ·࣮ͩݧతػೳ Android7 Ҏ߱ Android7 Ҏ߱ license Googleར༻ن໿ʹ४ڌ MIT License ※Modelͱ͸ผLicense Apache 2.0 Gemma license