Zum Inhalt springen →

Gradio Machine Learning Web Apps GDPR kompatibel

Gradio ist ein Open-Source Python Package, mit dem man schnell und einfach eine Webanwendung für ein Machine Learning Model erstellen kann. Die Idee ist es, die Komplexität von Machine-Learning-Modellen zu reduzieren und eine einfache Möglichkeit zu haben, eine interaktive Machine Learning Web-Anwendungen zu erstellen.

Eine einfache einführung in Gradio gibt es z.B. hier:

Build Machine Learning Applications Easily with Gradio in Python

Gradio wird auch von einigen Anwendungen als Web-Interface genutzt, um z.B. schnell und einfach auf ein LLM zugreifen zu können. Ich nutze z.B. gerne FastChat (https://github.com/lm-sys/FastChat) um eine Web-GUI für ein LLM zu erstellen. Mit folgenden 3 Zeilen kann man eine einfache Web-GUI für ein LLMs starten.

#!/bin/sh

export LOGDIR=/home/michael/fastchat/logs
python3 -m fastchat.serve.gradio_web_server --host localhost --port 8001

Dieser Aufruf startet einen Gradio Webserver, der dann eine Chat-GPT ähnlich Oberfläche unter http://localhost:8001/ erzeugt und einen Zugriff auf die Modelle zur Verfügung stellt, die vom FastChat Worker bereitgestellt werden.

Das geht also sehr schnell und extrem einfach. Ist aber leider nicht GDPR kompatibel :-(.

Gradio und DSGVO / GDPR 

Möchte man so eine Gradio Web-Anwendung im Internet öffentlich zur Verfügung stellen, steht man schnell vor dem Dilemma, dass auch von anderen Webseiten Daten nachgeladen werden.

Unter anderem werden Google-Fonts, JavaScript Bibliotheken von Cloudflare und sogar Google-Analytics mit der ID „UA-156449732-1“ nachgeladen.

An der Stelle wird es problematisch, da die Webseite personenbezogene Daten wie z.B. die IP-Adresse an Dritte weiter gibt ohne vorher um Erlaubnis zu fragen.

Durchsucht man die Gradio Sourcen mal danach, findet man schnell heraus, dass Gradio die Templates verwendet die z.B. unter „/usr/local/lib/python3.8/dist-packages/gradio/templates“ abgelegt sind und es offensichtlich nicht vorgesehen ist, diese mal eben zu ändern :-(.

Unter https://github.com/gradio-app/gradio/issues/4226 kann man z.B. nachlesen, dass „abidlabs“ dazu nur schreibt:

… Analytics are essential to helping us develop gradio and understand how gradio is being used by developers. The reason we collect analytics is because they provide the clearest signal on component/feature use, helping us prioritize issues related to commonly-used features of the library and letting us understand the implications of deprecating less-used features. As a library with over 2,000 issues that is heavily informed by the community, losing these analytics, or even switching to opt-out analytics (which tend to be more biased in practice) would be a big loss for the development team. gradio being an open-source library, the specific analytics that are collected are fully transparent …

https://github.com/gradio-app/gradio/issues/4226

Wie es scheint, gehört also die Analytics-Id UA-156449732-1 dem Huggingface Development Team. Eigentlich schade, denn ich brauche all das nicht. Die Google-Fonts und die JavaScript Bibliotheken können auch lokal gehostet werden und Google Analytics kann meinetwegen ersatzlos gestrichen werden.

Ein Lichtblick

Eine Lösung für dieses Problem hat der GutHub Benutzer Jun Chen (junchen1992) mit dem Projekt Gradio-Offline unter https://github.com/junchen1992/gradio-offline bereitgestellt.

Gradio-Offline Installation

Die Installation von Gradio Offline ist denkbar einfach und nach der Installation muss nichts an der App geändert werden. Gradio-Offline kann auch mit dem Befehl „import gradio“ genutzt werden, so dass nach der Installation nichts an der existierenden Web-App geändert werden muss – nice :-).

1. Suche die aktuelle Gradio installation

Die aktuelle Gradio installation kann man einfach finden, indem man auf der Konsole einen Python Interperter mit der Option „-v“ startet und dort gradio importiert.

python -v
>>>import gradio
.....
# code object from '/usr/local/lib/python3.8/dist-packages/gradio/__pycache__/mix.cpython-38.pyc'
import 'gradio.mix' # <_frozen_importlib_external.SourceFileLoader object at 0xffff6fa12160>
import 'gradio' # <_frozen_importlib_external.SourceFileLoader object at 0xffffa2f47730>

Mit der Option „-v“ für Verbose gibt der Python Interpreter alle möglichen Informationen aus. Darunter auch den Pfad der Gradio Installation. In meinem Fall ist das „/usr/local/lib/python3.8/dist-packages/gradio

2. Python Gradio Package sichern

Sicherheitshalber verschiebe ich den Odrner /usr/local/lib/python3.8/dist-packages/gradio um bei Problemen schnell wieder auf die vorherige Version zurückgreifen zu können.

sudo mv /usr/local/lib/python3.8/dist-packages/gradio /usr/local/lib/python3.8/dist-packages/gradio.bak

Wer hier keine Angst hat, etwas kaput zu machen, kann auch auf die Schritte 1 und 2 verzichten und die vorhandene gradio Installation ersatzlos löschen.

3. Gradio-Offline installieren

Unter https://pypi.org/project/gradio-offline/ kann man nachlesen, dass man gradio-offline mit folgendem Aufruf installieren kann.

PS: Natürlich mit sudo 🙂

sudo pip install gradio-offline

Danach noch man die Web-UI vom Fastchat neu starten und schon läuft der Server wieder.

2024-01-23 20:25:39 | INFO | gradio_web_server | args: Namespace(add_chatgpt=False, add_claude=False, add_palm=False, concurrency_count=10, controller_url='http://localhost:21001', gradio_auth_path=None, host='localhost', model_list_mode='once', moderate=False, port=8001, register_openai_compatible_models=None, share=False, show_terms_of_use=False)
2024-01-23 20:25:39 | INFO | gradio_web_server | Models: ['deepseek-coder-1.3b-instruct', 'deepseek-coder-6.7b-instruct']
2024-01-23 20:25:39 | INFO | stdout | Running on local URL:  http://localhost:8001
2024-01-23 20:25:39 | INFO | stdout |
2024-01-23 20:25:39 | INFO | stdout | To create a public link, set `share=True` in `launch()`.

So weit so gut. Noch mal checken, von welchen Servern die Daten geladen werden?

Ein kurzer Check zeigt, dass es auch ohne CDN, Analytics und Google-Font Server funktioniert.

Fazit:

Es geht auch ohne 🙂

Veröffentlicht in Allgemein