Swift для машинного обучения: возможности и ограничения на практике
Мир машинного обучения (ML) долгое время ассоциировался исключительно с Python. Однако с ростом популярности iOS/macOS-разработки и появлением мощных фреймворков от Apple, язык Swift всё активнее входит в эту сферу. В этой статье мы разберём, насколько Swift пригоден для ML-задач, какие инструменты он предлагает, где его использование оправдано, а где — пока уступает классическому Python.
Почему Swift? Экосистема Apple и производительность
Swift — это компилируемый язык с системой строгой типизации и высокой производительностью, близкой к C++. Для машинного обучения это даёт несколько ключевых преимуществ:
- Скорость выполнения: нативные вычисления без накладных расходов интерпретатора.
- Интеграция с платформами Apple: прямой доступ к Metal (GPU), Neural Engine, Accelerate framework.
- Безопасность памяти: меньше ошибок времени выполнения по сравнению с Python.
Однако главный драйвер — это стремление Apple сделать ML доступным для мобильных разработчиков. Вместо того чтобы изучать Python и отдельно разворачивать модели, iOS-разработчик может оставаться в родной среде Xcode.
Ключевые фреймворки
Apple предоставляет три основных инструмента для работы с ML на Swift:
- Core ML — рантайм для запуска моделей на устройстве.
- Create ML — фреймворк для обучения моделей без Python.
- MLX (открытый проект Apple) — для более глубоких исследований.
Запуск готовых моделей с Core ML
Самый распространённый сценарий — интеграция предобученной модели в мобильное приложение. Swift здесь на высоте: код минимален и интуитивно понятен.
Пример классификации изображения с помощью Core ML и Vision:
import Vision
import CoreML
// 1. Загружаем модель (например, MobileNetV2)
guard let model = try? VNCoreMLModel(for: MobileNetV2().model) else {
fatalError("Не удалось загрузить модель")
}
// 2. Создаём запрос
let request = VNCoreMLRequest(model: model) { request, error in
if let results = request.results as? [VNClassificationObservation] {
// Выводим топ-3 предсказания
for result in results.prefix(3) {
print("\(result.identifier): \(result.confidence * 100)%")
}
}
}
// 3. Выполняем запрос на изображении
guard let image = UIImage(named: "cat.jpg"),
let ciImage = CIImage(image: image) else { return }
let handler = VNImageRequestHandler(ciImage: ciImage)
try? handler.perform([request])
Как видите, Swift позволяет выполнить инференс в 10-15 строк кода. Всё работает нативно, используя GPU или Neural Engine.
Обучение моделей с Create ML
Create ML — это попытка Apple сделать обучение моделей доступным для обычных разработчиков. Вы можете обучать классификаторы изображений, текста, таблярные данные и даже модели рекомендаций, не покидая Swift.
Пример: обучение классификатора текста
Допустим, у нас есть CSV-файл с отзывами и метками (positive/negative). Обучение выглядит так:
import CreateML
import Foundation
// 1. Загружаем данные
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "reviews.csv"))
// 2. Разделяем на обучающую и тестовую выборки
let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 42)
// 3. Создаём классификатор
let classifier = try MLTextClassifier(trainingData: trainingData,
textColumn: "text",
labelColumn: "label")
// 4. Оцениваем точность
let evaluation = classifier.evaluation(on: testingData)
print("Точность: \(evaluation.classificationError * 100)%")
// 5. Сохраняем модель для Core ML
try classifier.write(to: URL(fileURLWithPath: "SentimentClassifier.mlmodel"))
Этот код полностью рабочий и выполняется в macOS playground или консольном приложении. Для iOS-разработчика это огромный плюс — не нужно переключаться на Python.
Ограничения: где Swift пока проигрывает Python
Несмотря на удобство, Swift для ML имеет ряд серьёзных ограничений, которые важно понимать.
1. Ограниченный выбор моделей и архитектур
Create ML поддерживает только базовые архитектуры. Вы не сможете обучить трансформер, GAN или сложную свёрточную сеть. Для этого нужен Python с PyTorch или TensorFlow.
2. Отсутствие гибкости в кастомизации
В Python вы можете переопределить любой слой, написать свой оптимизатор или функцию потерь. В Swift (Create ML) вы ограничены тем, что предоставила Apple. Любая кастомная архитектура требует использования Swift for TensorFlow (проект заморожен) или MLX.
3. Экосистема библиотек
В Python есть scikit-learn, pandas, numpy, matplotlib. В Swift их аналоги (Swift Numerics, Swift Plot) пока слабее и менее популярны.
4. Сообщество и ресурсы
На Stack Overflow вопросов по Swift+ML в десятки раз меньше, чем по Python. Найти готовый пример или решение проблемы сложнее.
MLX: новый шаг Apple в научные вычисления
В 2023 году Apple представила MLX — фреймворк для машинного обучения на Swift, ориентированный на исследователей. Он позволяет писать кастомные модели и обучать их на GPU/Metal.
Пример линейной регрессии с MLX:
import MLX
import MLXNN
// Определяем модель
class LinearRegression: Module {
@ModuleParam var w: MLXArray
@ModuleParam var b: MLXArray
init(inputDim: Int) {
w = MLXArray(MLXRandom.normal([inputDim, 1]))
b = MLXArray(MLXRandom.normal([1]))
}
func callAsFunction(_ x: MLXArray) -> MLXArray {
return matmul(x, w) + b
}
}
// Создаём данные и обучаем
let model = LinearRegression(inputDim: 1)
let optimizer = SGD(learningRate: 0.01)
let lossFunc = MSELoss()
for epoch in 0..<100 {
let loss = lossFunc(model(xTrain), yTrain)
optimizer.step(model: model, loss: loss)
}
MLX — это мощный инструмент, но он всё ещё сырой и не имеет такого