DevGang
Авторизоваться

Безопасный анализ настроений с помощью Enclaves

Задача данной статьи будем заключаться в создании безопасного приложения для анализа настроений с использованием TensorFlow Lite и применение его в системе безопасного облачного enclave Cape Privacy.

Анализ настроений и система безопасности Cape

Анализ настроений (sentiment analysis) - это приложение обработки естественного языка (НЛП), которое классифицирует настроение текста, как правило, как положительное или отрицательное. Поскольку огромные объемы данных существуют в текстовой форме, анализ настроений имеет множество практических применений, включая мониторинг социальных сетей, анализ отзывов клиентов, анализ новостей, исследование рынка и т.д. Таким образом, автоматизированная обработка такого типа данных позволяет эффективно извлекать ценную информацию.

Однако что, если текстовые входные данные, которые нам нужно проанализировать, являются конфиденциальными или должны оставаться конфиденциальными? Именно здесь на помощь приходит система безопасного enclave Cape Privacy. Cape Privacy предоставляет конфиденциальную вычислительную платформу на основе enclave AWS Nitro для разработчиков, заботящихся о безопасности и конфиденциальности. Cape позволяет запускать бессерверные функции с зашифрованными данными и гарантирует защиту конфиденциальных данных или интеллектуальной собственности в приложениях.

Cape предоставляет интерфейс командной строки (CLI), а также наборы для разработки программного обеспечения на Python и JavaScript (SDK) под названием pycape и cape-js, которые позволяют разработчикам развертывать свои приложения и позволяют пользователям безопасно взаимодействовать с ними.

Есть три основных компонента, которые позволяют это сделать: cape encrypt, cape deploy, и cape run. Команда cape encrypt шифрует входные данные, которые могут быть отправлены в Cape enclave для обработки, cape deploy выполняет все необходимые действия для развертывания функции в enclave, и, наконец, cape run вызывает развернутую функцию с вводом, который ранее был зашифрован с помощью cape encrypt.

Далее мы переходим к поэтапному созданию приложений для анализа настроений с помощью Cape.

Обучение модели классификации текста

Функция, которую мы хотим развернуть и запустить в случае анализа настроений, представляет собой модель классификации текста (text classification model), и поэтому нам нужно сначала определить ее архитектуру и обучить ее.

Чтобы сделать модель легкой, мы решили использовать TensorflowLite и его библиотеку Model Maker. Обучающие данные, которые мы используем, - это SST-2 (Stanford Sentiment Treebank), широко используемый набор данных, опубликованный Socher et al. (2013), который состоит из более чем 60 000 обзоров фильмов, помеченных как положительные или отрицательные. Для архитектуры модели мы используем встраивание среднего слова, которое создает модель небольшого размера и, следовательно, может выполнять быстрый вывод. Следующий фрагмент кода показывает определение модели и процедуру обучения и экспортирует обученную модель и ее словарь в виде модели TensorFlow Lite.

Устанавливаем зависимости:

!sudo apt -y install libportaudio2
!pip install -q tflite-model-maker-nightly

Импортируем библиотеки:

import numpy as np
import os

from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.config import ExportFormat
from tflite_model_maker.text_classifier import AverageWordVecSpec
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
import pandas as pd
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

Подготовим обучающие данные:

 df.to_csv(new_file)

# Replace the label name for both the training and test dataset. Then write the
# updated CSV dataset to the current folder.
replace_label(os.path.join(os.path.join(data_dir, 'train.tsv')), 'train.csv')
replace_label(os.path.join(os.path.join(data_dir, 'dev.tsv')), 'dev.csv')

spec = model_spec.get('average_word_vec')

train_data = DataLoader.from_csv(
     filename='train.csv',
     text_column='sentence',
     label_column='label',
     model_spec=spec,
     is_training=True)
test_data = DataLoader.from_csv(
     filename='dev.csv',
     text_column='sentence',
     label_column='label',
     model_spec=spec,
     is_training=False)

Составляем модель:

model = text_classifier.create(train_data, model_spec=spec, epochs=10)

Оцениваем модель:

loss, acc = model.evaluate(test_data)

Экспортируем модель в качестве Tensorflow Lite:

model.export(export_dir='model')
model.export(export_dir='model', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

Создание функции

Любая функция, развернутая с помощью Cape, должна быть названа app.py, где app.py должен содержать функцию с именем cape_handler(), которая принимает входные данные, обрабатываемые функцией, и возвращает результаты. В случае приложения для анализа настроений входным сигналом является текст, который мы хотим классифицировать, а выходным сигналом является настроение, которое может быть отрицательным или положительным.

Приведенный ниже фрагмент кода показывает наш app.py . Мы можем видеть, что функция cape_handler() загружает модель TensorFlow Lite, которую мы ранее обучили, а также ее словарь. Кроме того, обработчик также векторизирует текстовые входные данные, используя словарь, таким образом, что входные данные кодируются как числовые векторы, прежде чем мы запустим вывод по ним. Затем модель предсказывает настроение этого закодированного текста и выводит его предсказанное настроение.

Импорт библиотек:

import numpy as np
from tflite_runtime.interpreter import Interpreter
import contractions

Функция загрузки словарного запаса:

def load_vocab(path):
    vocabulary = {}
    with open(path, "r") as f:
        for i, line in enumerate(f.readlines()):
            item = line.strip().split(" ")
            word = item[0]
            encoding = int(item[1])
            vocabulary[word] = encoding
    return vocabulary

Функция векторизации текста:

def vectorize_text(text, vocabulary, input_shape):
    encoded_text = []

    # Fix contractions
    expanded_words = []
    for word in text.split():
        expanded_words.append(contractions.fix(word))
    text = " ".join(expanded_words)

    text = text.split(" ")
    for word in text:
        word = word.lower()  # convert to lower case
        # account for words not in vocabulary
        if word in vocabulary.keys():
            word_encoding = vocabulary[word]
        else:
            word_encoding = vocabulary["<UNKNOWN>"]
        encoded_text.append(word_encoding)
    encoded_text = np.array(encoded_text, dtype=np.int32)
    encoded_text = np.pad(
        encoded_text, (0, input_shape[1] - len(encoded_text)), "constant"
    )
    encoded_text = np.reshape(encoded_text, (input_shape[0], input_shape[1]))
    return encoded_text

Обработчик Cape:

def cape_handler(text):
    text = text.decode("utf-8")

    # Load vocabulary
    vocabulary = load_vocab("./vocab.txt")

    # Load the TFLite model and allocate tensors.
    interpreter = Interpreter(model_path="./model.tflite")
    interpreter.allocate_tensors()

    # Get input and output tensors.
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    # Predict
    input_shape = input_details[0]["shape"]
    input_data = vectorize_text(
        text=text, vocabulary=vocabulary, input_shape=input_shape
    )
    interpreter.set_tensor(input_details[0]["index"], input_data)
    interpreter.invoke()

    output_data = interpreter.get_tensor(output_details[0]["index"])
    output_result = np.argmax(output_data)

    if output_result == 1:
        result = "positive"
    else:
        result = "negative"

    prob = output_data[0][output_result] * 100
    return (str(float(f'{prob:.2f}')) + "% " + result) or "You've stumped me! Please try a different phrase."

Дислоцирование с помощью Cape

Чтобы развернуть нашу функцию с помощью Cape, нам сначала нужно создать папку, содержащую все необходимые зависимости. Для этого приложения для анализа настроений эта папка развертывания должна содержать app.py, выше приведена обученная модель фильтра и ее словарный запас. Кроме того, поскольку app.py программа импортирует некоторые внешние библиотеки, они также должны быть в папке развертывания. Мы можем сохранить список этих зависимостей в requirements.txt файл и запустите docker, чтобы установить эти зависимости в нашу папку развертывания под названием app следующим образом:

sudo docker run -v `pwd`:/build -w /build --rm -it python:3.9-slim-bullseye pip install -r requirements.txt --target ./app/

Теперь, когда у нас все готово, мы можем войти в Cape:

cape login

Your CLI confirmation code is: GZPN-KHMT
Visit this URL to complete the login process: https://login.capeprivacy.com/activate?user_code=GZPN-KHMT
Congratulations, you're all set!

И после этого мы можем развернуть приложение:

cape deploy ./app

Deploying function to Cape ...
Success! Deployed function to Cape
Function ID ➜ CzFFUHDyjq6Uqm8MCVfdVc
Checksum ➜ eb989a5ef2fabf377a11ad5464b81b67757fada90a268c8c6d8f2d95013c4681

Запуск с Cape

Теперь, когда приложение развернуто, мы можем передать ему входные данные и вызвать его с помощью cape run:

cape run CzFFUHDyjq6Uqm8MCVfdVc "This was a great film"

78.08% positive

Интерфейс JavaScript с Cape SDK

В дополнение к CLI, Cape также предоставляет SDK для Python и JavaScript. Более того, CLI также позволяет разработчикам генерировать токены для своих функций следующим образом:

cape token <function ID> -- expires <number of seconds>

Затем мы можем использовать cape-js для вызова функции, развернутой в enclave. Во-первых, нам нужно установить cape-js с помощью:

npm install @capeprivacy/cape-sdk

Или:

yarn add @capeprivacy/cape-sdk

Затем мы можем импортировать его в нашу программу JavaScript:

import { Cape } from '@capeprivacy/cape-sdk';

В нашей программе JavaScript, которую мы использовали для создания внешнего интерфейса, мы можем использовать токен функции для подключения к enclave с помощью cape-js следующим образом.

const client = new Cape ({ functionToken: <function token>});

Идентификатор функции затем используется для запуска функции, которую мы ранее развернули в enclave с помощью cape deploy.

await client.run({ id: '<FUNCTION_ID>', data: 'input' });

Используя JavaScript и cape-js, мы создали интерфейс для приложения для анализа настроений, которое позволяет пользователям заходить на веб-сайт, вводить любой текст, нажимать кнопку и видеть прогнозируемые настроения.

Заключение

В этой статье мы рассмотрели один пример использования конфиденциальной вычислительной платформы Cape, основанной на AWS Nitro enclaves. В частности, мы создали приложение для анализа настроений с помощью TensorFlow lite, которое классифицирует настроение любого текста как положительное или отрицательное. Мы показали, как это приложение может быть легко развернуто с помощью CLI Cape, чтобы гарантировать, что обработка текстовых данных выполняется безопасно. В дополнение к CLI мы также продемонстрировали, как cape-js, JavaScript SDK Cape, который можно использовать в программах JavaScript, может подключаться к enclave и запускать любую развернутую функцию. Созданный нами интерфейс предоставляет пользователям Cape графический интерфейс для взаимодействия с приложением анализа настроений в дополнение к CLI.

#Cloud #Машинное обучение
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу