Клієнт із фінтеху передає дані для скорингу, але вимагає, щоб навіть адміністратор хмари не бачив вихідні значення. Гомоморфне шифрування (HE) дозволяє виконувати ML-інференс на зашифрованих даних — сервер математично не може отримати доступ до plaintext. Наприклад, один із наших клієнтів — банк, впровадив HE для скорингової моделі, що дозволило скоротити витрати на аудит на 30%. У цій статті розберемо практичну реалізацію HE для ML на базі схеми CKKS та бібліотеки Microsoft SEAL. Наш досвід включає 10+ проєктів для фінтеху та медицини, гарантуємо конфіденційність на рівні шифрування. Зв'яжіться з нами, щоб оцінити придатність HE для вашого проєкту.
Проблеми, які вирішує HE
Проблема 1: довіра до хмарного провайдера. MLaaS-провайдери часто не можуть гарантувати, що дані не будуть прочитані адміністратором. HE усуває цей ризик: обчислення над шифротекстом не вимагають розшифровки.
Проблема 2: нормативні обмеження. GDPR, HIPAA, ЦБ РФ вимагають захисту персональних даних при обробці. HE дозволяє дотримуватись вимог без відмови від хмарних обчислень.
Проблема 3: продуктивність. Наївна реалізація HE дає величезний overhead (до 30 000x). Оптимізація через SIMD-упаковку та вибір схеми CKKS знижує його до 600x.
Чому CKKS — найкращий вибір для ML?
CKKS перевершує FHE за продуктивністю в 10–50 разів для типових ML-моделей. Вона підтримує наближені обчислення з плаваючою точкою та SIMD-упаковку — один шифротекст вміщує тисячі значень, що прискорює batch-обробку. Лінійний шар 1024→512 виконується за 80 мс на зашифрованих даних (plaintext — 0,1 мс), але паралельна обробка 64 прикладів знижує overhead до 600x.
Практична реалізація з Microsoft SEAL
import seal from seal import EncryptionParameters, scheme_type, SEALContext from seal import KeyGenerator, Encryptor, Evaluator, Decryptor from seal import CKKSEncoder, RelinKeys, GaloisKeys # Setup CKKS parameters parms = EncryptionParameters(scheme_type.ckks) poly_modulus_degree = 8192 # Security level parms.set_poly_modulus_degree(poly_modulus_degree) parms.set_coeff_modulus(seal.CoeffModulus.Create(poly_modulus_degree, [60, 40, 40, 60])) context = SEALContext(parms) keygen = KeyGenerator(context) public_key = keygen.create_public_key() secret_key = keygen.secret_key() relin_keys = keygen.create_relin_keys() galois_keys = keygen.create_galois_keys() scale = 2.0**40 encoder = CKKSEncoder(context) # Client encrypts input input_data = [0.5, 0.3, 0.8, ...] # Feature vector plain = encoder.encode(input_data, scale) encrypted_input = Encryptor(context, public_key).encrypt(plain) # Server computes on encrypted data (doesn't see actual values) evaluator = Evaluator(context) # ... matrix multiplication, activation approximation ... encrypted_result = evaluator.multiply_plain(encrypted_input, weight_matrix) # Client decrypts result result = Decryptor(context, secret_key).decrypt(encrypted_result) output = encoder.decode(result) Як апроксимувати нелінійні функції?
Головна проблема HE — нелінійні функції (ReLU, sigmoid) не підтримуються напряму, лише поліноми. Рішення:
- ReLU: апроксимація поліномом ступеня 3–7 на робочому діапазоні. Ступінь 3 дає ~1–2% деградації точності, але вимагає значно менше множень.
- Sigmoid: ряд Тейлора або minimax polynomial.
- Softmax: вимагає спеціальної обробки через ділення.
Альтернатива: заміна архітектури на HE-friendly — квадратичні активації (x²) замість ReLU. Це усуває апроксимацію, але вимагає перенавчання моделі.
Порівняння схем HE
| Характеристика | PHE | SHE | FHE | CKKS |
|---|---|---|---|---|
| Підтримка додавання | Так | Так | Так | Так |
| Підтримка множення | Обмежено | Так | Так | Так |
| Глибина обчислень | 1 | Обмежена | Без обмежень | До 10 шарів без bootstrapping |
| Точність | Висока | Висока | Висока | Наближена |
| latency | Низька | Середня | Висока | Середня |
Продуктивність та обмеження
| Операція | Plaintext | HE (CKKS) | Overhead |
|---|---|---|---|
| Лінійний шар (1024→512) | 0.1 ms | 80 ms | ~800x |
| Batch inference (64 приклади) | 5 ms | 3000 ms | ~600x |
| Проста CNN (MNIST) | 1 ms | 30–60 s | ~30000x |
Практично застосовно сьогодні для логістичної регресії, неглибоких мереж та privacy-preserving inference в MLaaS. Економія на інфраструктурі досягає 40% за рахунок відмови від виділених HSM.
Типові помилки при впровадженні HE
- Вибір невідповідної схеми (наприклад, PHE для глибоких мереж).
- Неправильна апроксимація активацій — поліном високого ступеня дає аномалії.
- Ігнорування шуму: при перевищенні глибини обчислень розшифровка дає сміття.
- Відсутність тестів на реальних даних: точність може впасти на 10% при неоптимальних параметрах.
HE-as-a-Service патерн
Найбільш реалістичний use case: хмарний MLaaS провайдер хоче пропонувати inference, не бачачи дані клієнтів.
- Провайдер навчає модель на публічних/синтетичних даних.
- Клієнт шифрує свої дані на своїй стороні.
- Клієнт надсилає шифротекст провайдеру.
- Провайдер обчислює inference на шифротексті.
- Провайдер повертає зашифрований результат.
- Клієнт розшифровує результат.
Провайдер ніколи не бачить ні вхідні дані, ні результат. Для коротких ланцюгів обчислень (глибина до 5) bootstrapping не потрібен.
Бібліотеки та фреймворки
| Бібліотека | Мова | Схеми | Особливості |
|---|---|---|---|
| Microsoft SEAL | C++/Python | BFV, CKKS | Продуктивність, doc |
| OpenFHE | C++/Python | BFV, CKKS, CGGI | Кроссплатформенність |
| Concrete (Zama) | Python | FHE | Компіляція з PyTorch |
| HElib | C++ | BGV | Довга історія, HE-специфіка |
Процес роботи
- Аналітика: аудит ML-моделі, визначення схеми HE та необхідної точності.
- Проектування: підбір параметрів (poly_modulus_degree, масштаб), апроксимація нелінійних функцій.
- Реалізація: інтеграція HE-шару в пайплайн (Python/C++), написання бенчмарків.
- Тестування: перевірка точності на зашифрованих даних, оптимізація latency.
- Деплой: розгортання на вашій інфраструктурі, навчання команди.
Що входить у реалізацію HE
- Аудит моделі та вибір оптимальної схеми HE.
- Розробка HE-сумісного пайплайну та інтеграція з вашою інфраструктурою.
- Документація та навчання команди.
- Технічна підтримка на етапі впровадження.
Терміни орієнтовно
- Неглибока модель (логістична регресія, 2–3 шари): від 8 тижнів.
- Складна модель (CNN, RNN): від 12 до 16 тижнів.
Терміни варіюються залежно від архітектури та вимог до точності. Вартість розраховується індивідуально.
Оцініть можливість впровадження HE для вашого ML-сервісу — зв'яжіться з нами для консультації. Замовте безкоштовну консультацію інженера за вашим проєктом.







