// desktop only

Презентации лучше смотреть с десктопа

Слайды рассчитаны на широкий экран, клавиатуру и формат 16:9. Откройте эту страницу на ноутбуке или компьютере.

Вернуться на сайт
// AppsConf X · 2025

LLM на iPhone:
от Ollama
до Foundation Model

Как запустить большую языковую модель прямо в кармане

Виктория Сипки//iOS Developer · BLACKHUB GAMES//AppsConf X 2025

// speaker

Кто говорит

// факты
  • Виктория Сипки
  • iOS Developer
  • BLACKHUB GAMES
  • Swift · Core ML · MPS
// фокус
  • LLM на устройстве
  • Open Source модели
  • Apple Foundation Models
  • privacy-first AI
// agenda

О чём поговорим

  • 01 · Что такое LLM
  • 02 · Open Source и Cloud LLM
  • 03 · Разработки Apple
  • 04 · LLM на устройстве
  • 05 · Выводы
// 01 / что такое LLM

Большие языковые
модели

// definition

Что такое LLM

Large Language Model — нейросеть, обученная предсказывать следующий токен.

Под капотом — гигантская функция со миллиардами параметров. На вход — текст, на выходе — распределение вероятностей следующего слова.

Application Layer
ChatGPTPerplexityCursorNotion AI
Model Layer
GPT-4ClaudeLlamaGeminiMistral
Infrastructure Layer
NVIDIAAWSGCPAzureApple Silicon
// parameters

Параметры LLM

Параметры — это веса, которые меняются во время обучения. У современных LLM их больше миллиарда.

catsatonamat97%tokenshidden layers · >1B paramsnext token
// intelligence?

LLM — полноценный интеллект?

// да
  • обобщает огромный объём текста
  • умеет рассуждать в пределах контекста
  • пишет код, тексты, анализирует
// нет
  • нет реального понимания
  • галлюцинирует факты
  • не имеет памяти и целей
  • это всё ещё next-token predictor
// where we are

Карта доклада

  • 01 · Что такое LLM
  • 02 · Open Source и Cloud LLM
  • 03 · Разработки Apple
  • 04 · LLM на устройстве
  • 05 · Выводы
// 02 / cloud vs open source

Виды LLM

// cloud

Cloud LLM

Закрытые модели, доступные через API.

ChatGPTOpenAI
ClaudeAnthropic
GeminiGoogle
GigaChatСбер
YandexGPTYandex
// open source

Open Source LLM

Веса публикуются — можно скачать и запустить локально.

LLaMAMeta
GemmaGoogle
DeepSeekDeepSeek AI
SmolLMHuggingFace
MistralMistral AI
QwenAlibaba
// cloud · cons

Недостатки Cloud LLM

  • NDA: нельзя загружать данные клиентов
  • высокий прайс на API при объёмах
  • запрет в ряде стран и юрисдикций
  • зависимость от чужой инфраструктуры
  • любой запрос покидает устройство
// why open source

Зачем нужны Open Source LLM

  • бесплатно — нет per-token биллинга
  • оффлайн — работают без интернета
  • приватно — данные не уходят наружу
  • персонализация — fine-tuning под себя
// adoption

Бизнесы уже используют LLM

Т-Банквнутренние ассистенты
Klarnacustomer support
СберGigaChat в продуктах

От саппорта и поиска по документам до генерации кода и аналитики.

// where to run

Где запускать Open Source

// на сервере
  • свой GPU-сервер или облако
  • единая модель на всех клиентов
  • требуется DevOps и MLOps
// на устройстве клиента
  • iPhone, Mac, ноутбук
  • нулевая стоимость инференса
  • данные не покидают устройство
// server · ollama

Запуск на сервере: Ollama

Один CLI — и локальный inference-сервер с REST API.

# установить
$ brew install ollama

# скачать и запустить модель
$ ollama run llama3

# или через API
$ curl http://localhost:11434/api/generate \
    -d '{"model":"llama3","prompt":"Привет"}'
// server · cons

Недостатки сервера

  • нет синхронизации между устройствами клиента
  • жёсткие требования к железу — GPU и VRAM
  • затраты на электричество и охлаждение
  • единая точка отказа
// caveat

Не совсем так строго

Модель на 8B параметров уже спокойно крутится на современном ноутбуке без отдельной видеокарты.

А значит — мост между «сервер» и «устройство клиента» постепенно стирается.

// hw requirements · DeepSeek-R1

Требования по GPU/VRAM

модельVRAMрекомендуемый GPU
Zero~1300 GBкластер из A100/H100
671B (full)~1300 GBmulti-node H100
1.5B Distill~3.5 GBRTX 3060 / M-серия
7B~16 GBRTX 4080 / M2 Pro
8B~18 GBRTX 4080 / M2 Pro
14B~32 GBRTX 4090 / M2 Max
32B~64 GB2× RTX 4090 / M3 Max
70B~140 GB2× A100 / 4× RTX 4090
// where we are

Карта доклада

  • 01 · Что такое LLM
  • 02 · Open Source и Cloud LLM
  • 03 · Разработки Apple
  • 04 · LLM на устройстве
  • 05 · Выводы
// 03 / apple stack

Разработки
Apple

// apple · stack

Преимущества экосистемы Apple

// apple neural engine
отдельный сопроцессор для ML
// metal performance shaders
низкоуровневый GPU compute
// core ml
высокоуровневый ML-фреймворк
// foundation models
on-device LLM от Apple
// ane

Apple Neural Engine (ANE)

Отдельный сопроцессор внутри Apple Silicon, заточенный под матричные операции.

CPUFabricGPUNeuralEngineCacheDRAMDRAMApple Silicon · упрощённая схема
// ane · what it powers

За что отвечает Neural Engine

  • Siri и распознавание речи
  • Face ID
  • распознавание объектов в Photos
  • live text, translate, dictation
  • обработка фото и видео в реальном времени
// why not cpu/gpu

Почему не CPU и не GPU

// CPU/GPU
  • универсальные, но неэффективные на ML
  • много энергии — садится батарея
  • занимают ресурсы под фоновые задачи
// ANE
  • специализирован под нейросети
  • низкое энергопотребление
  • высокая пропускная способность TOPS
  • параллельно с CPU и GPU
// mps

Metal Performance Shaders

Metal Performance Shaders

Низкоуровневый фреймворк для вычислений на GPU Apple. Базовые кирпичи нейросетей — уже реализованы.

// mps · features

Что умеет MPS

  • matrix multiplication
  • свёртки (convolution)
  • функции активации (ReLU, GELU, …)
  • нормализации (batch / layer norm)
  • softmax, attention-блоки
// mps · imports

llm.cpp + Metal

#import <Metal/Metal.h>
#import <MetalPerformanceShaders/MetalPerformanceShaders.h>
#import <MetalPerformanceShadersGraph/MetalPerformanceShadersGraph.h>

id<MTLDevice> device = MTLCreateSystemDefaultDevice();
MPSGraph *graph = [[MPSGraph alloc] init];
// mps · matmul

Перемножение матриц на GPU

MPSGraphTensor *a = [graph placeholderWithShape:@[@M, @K] dataType:MPSDataTypeFloat16];
MPSGraphTensor *b = [graph placeholderWithShape:@[@K, @N] dataType:MPSDataTypeFloat16];

MPSGraphTensor *c = [graph matrixMultiplicationWithPrimaryTensor:a
                                                 secondaryTensor:b
                                                            name:@"matmul"];
// mps · digit recognition

Распознавание цифр через MPS

MPSCNNConvolution *conv = [[MPSCNNConvolution alloc]
    initWithDevice:device
   convolutionDescriptor:descriptor
           kernelWeights:weights
               biasTerms:biases
                   flags:MPSCNNConvolutionFlagsNone];

[conv encodeToCommandBuffer:cmdBuffer
              sourceImage:input
         destinationImage:output];

Это уровень «руками» — ниже него только Metal-шейдеры.

// core ml

Core ML

Высокоуровневый фреймворк Apple для запуска ML-моделей на устройстве. Сам выбирает, что отправить на CPU, GPU или ANE.

image · text · audioinputs.mlmodelCore ML runtimeCPU · GPU · ANElabels · текстoutputsCore ML сам выбирает, где исполнять граф
// core ml · format

Формат .mlmodel

  • единый бинарный формат для inference на Apple-устройствах
  • конвертеры из PyTorch, TensorFlow, ONNX
  • квантизация и нейроный engine compile «из коробки»
  • версионируется как обычный asset в проекте Xcode
// core ml · swift

Использование в Swift

import CoreML

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

let model = try MyModel(configuration: config)
let prediction = try model.prediction(input: features)
print(prediction.label)
// core ml · pros

Что даёт Core ML

  • минимум кода — модель как obj-c класс
  • автоматический выбор железа
  • on-device inference, без сети
  • интеграция с Vision, NaturalLanguage, Speech
// core ml · cons

Ограничения Core ML

  • не все операции конвертируются один-в-один
  • дебажить ниже фреймворка тяжело
  • часть архитектур плохо ложится на ANE и уходит на CPU
// foundation models

Apple Foundation Models

Собственная on-device LLM Apple — около 3B параметров, оптимизирована под Apple Silicon.

Доступна через свежий фреймворк FoundationModels в iOS 18+.

// foundation models · swift

LanguageModelSession

import FoundationModels

let session = LanguageModelSession()

let response = try await session.respond(
    to: "Опиши преимущества on-device LLM"
)

print(response.content)
// availability

Проверка доступности

struct AvailabilityExample: View {
    var body: some View {
        if SystemLanguageModel.default.isAvailable {
            Text("LLM доступна на этом устройстве")
        } else {
            Text("Нужен iPhone 15 Pro или новее")
        }
    }
}
// where we are

Карта доклада

  • 01 · Что такое LLM
  • 02 · Open Source и Cloud LLM
  • 03 · Разработки Apple
  • 04 · LLM на устройстве
  • 05 · Выводы
// 04 / on-device

LLM на
устройстве

// app store

Private LLM

В App Store уже есть приложения, которые запускают LLM полностью локально — например, Private LLM.

Никаких облаков, никакой телеметрии — модель живёт в файле приложения.

// diy

Можно сделать самому

  • open source проекты вроде Silo на GitHub
  • модели типа Llama-3.2-3B-Instruct
  • квантизация в формат GGUF под мобильное железо
  • SwiftUI обёртка над llama.cpp / MLX
// how it works

Как оно работает

  • LlamaContext — обёртка над загруженным графом модели
  • create_context — выделение памяти и инициализация весов
  • completion_init — токенизация промпта
  • completion_loop — пошаговая генерация токенов
// code · init

Инициализация

final class LlamaContext {
    private var model: OpaquePointer?
    private var ctx: OpaquePointer?

    init(modelPath: String) throws {
        var params = llama_model_default_params()
        params.n_gpu_layers = 999  // всё на GPU/ANE
        self.model = llama_load_model_from_file(modelPath, params)
        self.ctx = llama_new_context_with_model(model, ctxParams)
    }
}
// code · tokenize

Токенизация промпта

func completionInit(prompt: String) {
    let tokens = tokenize(text: prompt)
    var batch = llama_batch_init(tokens.count, 0, 1)
    for (i, token) in tokens.enumerated() {
        llama_batch_add(&batch, token, Int32(i), [0], false)
    }
    llama_decode(ctx, batch)
}
// code · loop

Цикл генерации

func completionLoop() -> String {
    var output = ""
    while output.count < maxTokens {
        let id = llama_sample_token(ctx, candidates)
        if id == llama_token_eos(model) { break }
        output += tokenToPiece(id)
        llama_decode(ctx, llama_batch_get_one(&id, 1))
    }
    return output
}
// stack · 3 ways

Три пути запуска

// Core ML
нативно, через .mlmodel
// llama.cpp
C++ + Metal backend
// LLM.swift / LLMFarm
Swift-обёртки поверх llama.cpp
// way · core ml

Путь 1 · Core ML

  • конвертируем модель в .mlmodel через coremltools
  • кладём в проект Xcode
  • инференс — тот же MyModel().prediction(...)
  • плюс — нативно; минус — не все архитектуры конвертируются гладко
// way · llama.cpp

Путь 2 · llama.cpp

  • C++ библиотека с Metal backend
  • нативный импорт в Xcode как Swift Package
  • максимум контроля над семплингом
  • самый зрелый стек для GGUF-моделей
// way · llm.swift

Путь 3 · LLM.swift и LLMFarm

  • готовые Swift-обёртки над llama.cpp
  • минимум кода — пара строк инициализации
  • LLMFarm — почти готовое UI-приложение
  • идеально для прототипа за вечер
// example · llm.swift

Пример с LLM.swift

import LLM

let bot = LLM(
    from: "/path/to/Llama-3.2-3B-Instruct-Q5_K_M.gguf",
    template: .llama
)

let answer = await bot.respond(
    to: "Объясни Core ML за 2 предложения"
)
print(answer)
// abstraction

Своя абстракция инференса

enum ModelInference {
    case coreML(MyModel)
    case llamaCpp(LlamaContext)
    case foundation(LanguageModelSession)
}
// load model

Загрузка модели

func loadModel(_ kind: ModelKind) throws -> ModelInference {
    switch kind {
    case .coreML(let url):
        return .coreML(try MyModel(contentsOf: url))
    case .llamaCpp(let path):
        return .llamaCpp(try LlamaContext(modelPath: path))
    case .foundation:
        return .foundation(LanguageModelSession())
    }
}
// predict

Универсальный predict

func predict(_ inference: ModelInference, prompt: String) async throws -> String {
    switch inference {
    case .coreML(let m):       return try m.predict(prompt)
    case .llamaCpp(let ctx):   return try ctx.complete(prompt)
    case .foundation(let s):   return try await s.respond(to: prompt).content
    }
}
// adoption

Как компании используют Local LLM

  • автогенерация описаний к Pull Request
  • inline code review без ухода кода в облако
  • локальные ассистенты в IDE
  • анализ логов и крэшей на устройстве разработчика
// ide

Code generation в IDE

  • локальные модели подсказывают сниппеты
  • нет утечки приватного кода
  • низкая задержка — нет round-trip в облако
  • работают офлайн в самолёте и поезде
// model zoo

Какие бывают модели

LLaMA
Mistral
Falcon
BERT
Qwen
Gemma
Phi
SmolLM
DeepSeek

Все они отличаются количеством параметров, лицензией и архитектурой.

// filename anatomy

Как читать имя модели

Llama-3.2-3B-Instruct-Q5_K_M.gguf
│      │   │   │        │       │
│      │   │   │        │       └─ контейнер
│      │   │   │        └─ квантизация (Q5_K_M)
│      │   │   └─ вариант (Instruct / Chat / Base)
│      │   └─ размер (3B параметров)
│      └─ версия модели
└─ семейство
// quantization

Размер · упрощение · вариант

// quantization
  • Q2 — самая лёгкая, заметная потеря качества
  • Q4 — компромисс, частый выбор для мобилок
  • Q5–Q6 — близко к fp16, тяжелее по RAM
// instruct vs chat
  • Base — сырая модель, predict-next-token
  • Instruct — обучена выполнять инструкции
  • Chat — формат диалога, system + user + assistant
// what fits where

Что куда влезает

чипмодельквантизация
A12 / A13~1BQ2
A14 / A153BQ3 – Q4
A16 · M13B – 7BQ4
A17 Pro · M27BQ5
M2 Pro / M38B – 13BQ5 – Q6
// further reading

Что ещё посмотреть

  • репозиторий Awesome Mobile LLMs на GitHub
  • документацию по FoundationModels и Core ML Tools
  • исходники llama.cpp и MLX от Apple
  • сравнения квантизаций на HuggingFace
// cons

Недостатки

  • Local LLM ограничены в объёме данных
  • требования к «железу»
  • iPhone 15 / 16 — комфортный минимум для 3B+ моделей
  • менее «интеллектуально развитые», чем GPT-4 класса
  • пока…
// state of ai

Это лишь начало

Apple отстаёт в разработке собственных моделей, но строит инфраструктуру так, чтобы их можно было запускать где угодно.

STATE OF AI
◤◢
GOOGLE
хищник
◤◢
MICROSOFT · OPENAI
хищник
:3
APPLE
догоняет
// where we are

Карта доклада

  • 01 · Что такое LLM
  • 02 · Open Source и Cloud LLM
  • 03 · Разработки Apple
  • 04 · LLM на устройстве
  • 05 · Выводы
// 05 / takeaways

Выводы

// takeaways

Что забрать с собой

  1. Private LLM удобны, но у них есть недостатки
  2. Open Source LLM позволяют бизнесу хранить данные локально
  3. iPhone уже достаточно для работы с LLM
  4. LLM на устройстве — шаг к автономности и приватности
  5. Apple активно развивает будущее LLM
  6. Уже сейчас можно использовать iPhone для AI-задач, готовясь к революции в технологиях
// the end

Спасибо!

Виктория Сипки//iOS Developer · BLACKHUB GAMES

slides
github