Swift для машинного обучения: возможности и ограничения
Мир машинного обучения (ML) традиционно ассоциируется с Python и его библиотеками (TensorFlow, PyTorch, scikit-learn). Однако разработчики экосистемы Apple всё чаще задаются вопросом: можно ли использовать Swift для задач машинного обучения? Swift — мощный, быстрый и безопасный язык, который лежит в основе всех современных приложений для iOS, macOS, watchOS и tvOS. В этой статье мы подробно разберём, какие инструменты доступны для ML на Swift, в чём их сила, а где они пока уступают Python.
Мы рассмотрим как нативные фреймворки Apple (Create ML, Core ML), так и сторонние решения (Swift for TensorFlow). Вы узнаете, подходит ли Swift для продакшн-моделей, обучения нейросетей или только для инференса на устройствах.
1. Нативные инструменты Apple: Create ML и Core ML
Apple активно развивает собственную экосистему для машинного обучения. Основные фреймворки — Create ML и Core ML — полностью написаны на Swift и оптимизированы для работы на устройствах Apple.
Create ML — обучение моделей без Python
Create ML — это фреймворк, позволяющий обучать модели машинного обучения прямо на macOS, используя только Swift. Он идеально подходит для задач классификации изображений, анализа текста, регрессии и рекомендательных систем. Главное преимущество — минимальный порог входа: не нужно устанавливать Python, настраивать CUDA или разбираться в сложных математических абстракциях.
Пример кода: обучение классификатора текста на Swift
import CreateML
import Foundation
// Загрузка данных из JSON
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "reviews.json"))
// Разделение на обучающую и тестовую выборки
let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 5)
// Создание и обучение модели
let sentimentClassifier = try MLTextClassifier(trainingData: trainingData,
textColumn: "text",
labelColumn: "label")
// Оценка точности
let evaluationMetrics = sentimentClassifier.evaluation(on: testingData)
print("Точность: \(evaluationMetrics.classificationError)")
// Сохранение модели в .mlmodel
let metadata = MLModelMetadata(author: "PythonLib User",
shortDescription: "Модель для анализа тональности",
version: "1.0")
try sentimentClassifier.write(to: URL(fileURLWithPath: "SentimentClassifier.mlmodel"),
metadata: metadata)
Этот код обучает модель на размеченных отзывах и сохраняет её в формате .mlmodel, который затем можно интегрировать в любое iOS/macOS приложение.
Core ML — инференс на устройствах
Core ML — это движок для выполнения моделей машинного обучения на устройствах Apple. Он поддерживает модели, обученные как в Create ML, так и в TensorFlow или PyTorch (через конвертацию в формат .mlpackage). Core ML использует аппаратное ускорение (Neural Engine, GPU, CPU) и обеспечивает работу модели офлайн, без задержек сети.
Пример: использование готовой модели Core ML в приложении
import CoreML
import Vision
// Загрузка модели
guard let model = try? VNCoreMLModel(for: ResNet50(configuration: MLModelConfiguration()).model) else {
fatalError("Не удалось загрузить модель")
}
// Создание запроса
let request = VNCoreMLRequest(model: model) { request, error in
guard let results = request.results as? [VNClassificationObservation],
let topResult = results.first else {
return
}
print("Распознано: \(topResult.identifier) с уверенностью \(topResult.confidence)")
}
// Выполнение на изображении
let handler = VNImageRequestHandler(url: URL(fileURLWithPath: "cat.jpg"))
try? handler.perform([request])
Этот код использует предобученную модель ResNet50 для классификации изображений. Всё работает на устройстве, без отправки данных на сервер.
2. Swift for TensorFlow: амбициозный, но замороженный проект
В 2018 году Google анонсировала Swift for TensorFlow (S4TF) — попытку создать первоклассный язык для глубокого обучения на базе Swift. Проект предлагал автоматическое дифференцирование, интеграцию с Python и высокую производительность. Однако в 2021 году Google прекратила активную разработку S4TF, передав сообществу наработки.
Сегодня S4TF существует как Swift Numerics и swift-ml пакеты, но они не имеют официальной поддержки. Для обучения сложных нейросетей на Swift это означает серьёзные ограничения:
- Нет готовых оптимизаторов (Adam, SGD) из коробки.
- Нет поддержки распределённого обучения.
- Мало предобученных моделей (в отличие от PyTorch Hub или TF Hub).
Тем не менее, для простых экспериментов и обучения основам дифференцирования S4TF всё ещё может быть полезен.
Пример: линейная регрессия на Swift с автодиффом (S4TF)
import TensorFlow
// Генерация данных
let x: Tensor<Float> = Tensor(randomNormal: [100, 1])
let y: Tensor<Float> = 3 * x + 2 + Tensor(randomNormal: [100, 1]) * 0.1
// Параметры модели
var w = Tensor<Float>(randomNormal: [1, 1])
var b = Tensor<Float>(zeros: [1])
// Обучение
for _ in 0..<1000 {
let ŷ = x • w + b
let loss = (ŷ - y).squared().mean()
let (∇w, ∇b) = gradient(at: w, b) { w, b in
return (x • w + b - y).squared().mean()
}
w -= 0.01 * ∇w
b -= 0.01 * ∇b
}
print("w = \(w.scalarized()), b = \(b.scalarized())")
Код демонстрирует базовое автоматическое дифференцирование, но для реальных проектов потребуется написать много вспомогательного кода вручную.
3. Ограничения Swift для машинного обучения
Несмотря на удобство для iOS-разработчиков, Swift значительно уступает Python в ML-экосистеме. Вот основные ограничения:
- Меньше библиотек и сообщества. В Python есть тысячи готовых пакетов (scikit-learn, XGBoost, LightGBM, Hugging Face). В Swift — только базовый набор.
- Сложность обучения сложных моделей. Create ML не поддерживает кастомные архитектуры нейросетей (трансформеры, GAN). Для этого придётся использовать S4TF или оборачивать Python-код.