HelperSheets/docker/OfflineGPT.md
2024-08-26 18:09:02 +02:00

10 KiB

Offline GPT mit einem h2o-Modell

Zuerst klonen wir uns das Repository:

git clone https://github.com/h2oai/h2ogpt.git

Nun machen wir ein git pull im Repository um sicherzugehen das wir auch alles haben.

Abhängigkeiten installieren (mit Anaconda)

conda create --name h2ogpt python=3.10

Nun aktivieren die Environment:

conda activate h2ogpt

Abhängigkeiten in der Umgebung installieren. Dazu mit der Anaconda Prompt im Repository Order sein.

pip install -r requirements.txt

Wir brauchen auch noch ein Base-Modell, welches wir nutzen können.

Diese können wir von huggingface.co herunterladen.

git clone https://huggingface.co/h2oai/h2ogpt-gm-oasst1-en-2048-falcon-7b-v3

In Windows gibt es den Bug, das die Dateien, welche größer als 4 GB sind, nicht herunterladbar sind. Es können verschiedene Modelle herunterladen werden. :)

Ausführen in der CLI & Debug

Nun haben wir einen Ordner wo alle Dateien vorhanden sind. Diesen brauchen wir dann um das Programm zu starten.

Dann starten wir das Programm indem wir:

python generate.py --base_model=h2ogpt-gm-oasst1-en-2048-falcon-7b-v3 --score_model=None --prompt_type=human_bot --cli=True

Fehler welche hier auftreten können:

  • No GPUs detected
  • ModuleNotFoundError: No module named 'langchain'
  • ...

Zum ersten Fehler: In der Environment dies überprüfen:

import torch
torch.cuda.is_available()

False --> Cache leeren und eine andere Version installieren.

Zum zweiten Fehler: In der Environment dies überprüfen:

pip install --upgrade langchain

Weitere Fehler müssen bei bedarf selber nachgesehen werden.

Jedoch könnten wir auch das Problem haben, das unser VRAM zu klein ist. Hierzu können wir das Model "effizienter" in die Grafikkarte laden. Aber wir haben einen Qualitätsverlust.

Dann starten wir das Programm indem wir:

python generate.py --base_model=h2ogpt-gm-oasst1-en-2048-falcon-7b-v3 --score_model=None --prompt_type=human_bot --cli=True --load_4bit=True

Skript zum Ausführen erstellen

Damit man nicht jedes Mal den Command eingeben muss, kann man ein kleines shell skript erstellen welches man dann einfach aufrufen kann. [in Linux]

model.sh

python generate.py \
    --share=False \
    --gradio_offline_level=1 \
    --base_model=h2ogpt-gm-oasst1-en-2048-falcon-7b-v3 \
    --score_model=None \
    --load_4bit=True \
    --prompt_type=human_bot

Ausführen mit run model.sh.

Ausführen mit einer Weboberfläche

Dazu muss man nur die Flag --cli=True entfernen.

Eigene Daten verwenden

Füge noch die Flag --langchain_mode=MyData mit ein.

Jedoch musste ich noch in der Umgebung mehrere Pakete installieren damit ich diese Funktion auch nutzen konnte.

pip install sentence_transformers
pip install unstructured
pip install unstructured[pdf]
pip install chromadb  <-- Hier ist Microsoft C++ notwendig
pip install xformers

Bei fehlern mit chromadb nutze pip install --upgrade chromadb==0.3.29.

Nun kann man an der linken seite seine Dokumente hochladen und man kann dazu Fragen stellen.

Als Dockerfile

Das ist die Dockerfile für einen rohen Chatbot. (Ohne Dokumentenverarbeitung und ohne GPU!)

# Use Ubuntu as the base image
FROM ubuntu:latest

# Set environment variables to avoid interactive prompts during Anaconda installation
ENV PATH="/root/anaconda3/bin:${PATH}"
ARG PATH="/root/anaconda3/bin:${PATH}"

# Set the working directory to /app
WORKDIR /app

# Update and upgrade Ubuntu packages
RUN apt-get update && apt-get upgrade -y

# Install necessary packages for Anaconda
RUN apt-get install -y wget bzip2 ca-certificates libglib2.0-0 libxext6 libsm6 libxrender1 git curl git-lfs

# Download Anaconda installer for Linux
RUN curl -o ~/anaconda.sh -O https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh

# Install Anaconda
RUN /bin/bash ~/anaconda.sh -b -p /root/anaconda3 && \
    rm ~/anaconda.sh && \
    echo "export PATH=/root/anaconda3/bin:$PATH" >> /root/.bashrc

# Clone the h2ogpt repository
RUN git clone https://github.com/h2oai/h2ogpt.git

# Pull the latest changes from the repository
RUN cd h2ogpt && git pull

# Create a conda environment named "h2ogpt" with Python 3.10
RUN /root/anaconda3/bin/conda create --name h2ogpt python=3.10 -y

# Activate the "h2ogpt" environment and install dependencies from requirements.txt
RUN /bin/bash -c "source activate h2ogpt && pip install -r /app/h2ogpt/requirements.txt"

# Installiere weitere abhängigkeiten
RUN pip install fire

# Clone the h2ogpt model
RUN git clone https://huggingface.co/h2oai/h2ogpt-gm-oasst1-en-2048-falcon-7b-v3

# Activate the "h2ogpt" Conda environment
SHELL ["/bin/bash", "-c"]
RUN source activate h2ogpt && \
    pip install langchain && \
    pip install posthog


# Set the default command to run the program
CMD ["/bin/bash", "-c", "source activate h2ogpt && python /app/h2ogpt/generate.py --share=False --gradio_offline_level=1 --base_model=h2ogpt-gm-oasst1-en-2048-falcon-7b-v3 --score_model=None --load_4bit=True --prompt_type=human_bot --langchain_mode=MyData"]

Hier mit den Paketen für die Dokumentverarbeitung: (unvollständig)

# Use Ubuntu as the base image
FROM ubuntu:latest

# Set environment variables to avoid interactive prompts during Anaconda installation
ENV PATH="/root/anaconda3/bin:${PATH}"
ARG PATH="/root/anaconda3/bin:${PATH}"

# Alle Dateien werden in "/app" reinkopiert/geladen
WORKDIR /app

# OS aktuell halten
RUN apt-get update && apt-get upgrade -y

# Abhängigkeiten für Anaconda
RUN apt-get install -y wget bzip2 ca-certificates libglib2.0-0 libxext6 libsm6 libxrender1 git curl git-lfs

# Anaconda installer für Linux
RUN curl -o ~/anaconda.sh -O https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh

# Install Anaconda
RUN /bin/bash ~/anaconda.sh -b -p /root/anaconda3 && \
    rm ~/anaconda.sh && \
    echo "export PATH=/root/anaconda3/bin:$PATH" >> /root/.bashrc

# Klone das h2ogpt repository
RUN git clone https://github.com/h2oai/h2ogpt.git

# Aktuell halten!
RUN cd h2ogpt && git pull

# Conda Environment erstellen
RUN /root/anaconda3/bin/conda create --name h2ogpt python=3.10 -y

# Aktiviere die Env und installiere die Abhängigkeiten hinein
RUN /bin/bash -c "source activate h2ogpt && pip install -r /app/h2ogpt/requirements.txt"

# Clone the h2ogpt model
# RUN git clone https://huggingface.co/h2oai/h2ogpt-gm-oasst1-en-2048-falcon-7b-v3

# Für "chromadb" brauchen wir einen c++ Compiler
RUN apt-get update && apt-get install -y g++

# Activiere die "h2ogpt" Conda Env und installiere noch weitere Pakete
SHELL ["/bin/bash", "-c"]
RUN source activate h2ogpt && \
    pip install langchain && \
    pip install posthog && \
    pip install unstructured && \
    pip install unstructured[pdf] && \
    pip install sentence_transformers && \
    pip install xformers && \
    pip install --upgrade chromadb==0.3.29 && \
    pip install fire

# Ordner für das Modell erstellen
RUN mkdir /app/usedModel

# generate.py ausführen
CMD ["/bin/bash", "-c", "source activate h2ogpt && python /app/h2ogpt/generate.py --share=False --gradio_offline_level=1 --base_model=/app/usedModel --score_model=None --load_4bit=True --prompt_type=human_bot --langchain_mode=MyData"]

# Ausführen des Containers mit:
# docker run --gpus all -p 7860:7860 -v C:\Users\User\Desktop\temp2\model:/app/usedModel h2otest

Aktuelles noch bekanntes Problem: GPU support NICHT verfügbar!

Hier die aktuellste Variante mit GPU support:

# Wir nutzen ein Image von NVIDIA
FROM nvidia/cuda:12.2.0-runtime-ubuntu20.04

# Lege für später Variablen für einen non-root User fest (mit fester UID zur besseren Zuweisung)
ENV NB_USER="gpuuser"
ENV UID=999

# Install essential packages
RUN apt-get update && apt-get install -y \
    python3.8 \
    python3-pip \
    python3.8-dev \
    python3.8-distutils \
    gcc \
    g++ \
    curl \
    wget \
    sudo \
 && rm -rf /var/lib/apt/lists/*

# Installiere hier PyTorch mit GPU support (Versionen können angepasst werden)
RUN python3.8 -m pip install --upgrade pip \
    torch==2.0.1\
    torchvision==0.15.2

# Erstellen eines non-root Users
RUN useradd -l -m -s /bin/bash -u $UID $NB_USER

# Set environment variables to avoid interactive prompts during Anaconda installation
ENV PATH="/root/anaconda3/bin:${PATH}"
ARG PATH="/root/anaconda3/bin:${PATH}"

# Alle Dateien werden in "/app" reinkopiert/geladen
WORKDIR /app

# OS aktuell halten
RUN apt-get update && apt-get upgrade -y

# Abhängigkeiten für Anaconda
RUN apt-get install -y wget
RUN apt-get install -y bzip2
RUN apt-get install -y ca-certificates
# RUN apt-get install -y libglib2.0-0
RUN apt-get install -y libxext6
RUN apt-get install -y libsm6
RUN apt-get install -y libxrender1
RUN apt-get install -y git
RUN apt-get install -y curl
RUN apt-get install -y git-lfs

# Anaconda installer für Linux
RUN curl -o ~/anaconda.sh -O https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh

# Install Anaconda
RUN /bin/bash ~/anaconda.sh -b -p /root/anaconda3 && \
    rm ~/anaconda.sh && \
    echo "export PATH=/root/anaconda3/bin:$PATH" >> /root/.bashrc

# Klone das h2ogpt repository
RUN git clone https://github.com/h2oai/h2ogpt.git

# Aktuell halten!
RUN cd h2ogpt && git pull

# Conda Environment erstellen
RUN /root/anaconda3/bin/conda create --name h2ogpt python=3.10 -y

# Aktiviere die Env und installiere die Abhängigkeiten hinein
RUN /bin/bash -c "source activate h2ogpt && pip install -r /app/h2ogpt/requirements.txt"

# Clone the h2ogpt model
# RUN git clone https://huggingface.co/h2oai/h2ogpt-gm-oasst1-en-2048-falcon-7b-v3

# Für "chromadb" brauchen wir einen c++ Compiler
RUN apt-get update && apt-get install -y g++

# Activiere die "h2ogpt" Conda Env und installiere noch weitere Pakete
SHELL ["/bin/bash", "-c"]
RUN source activate h2ogpt && \
    pip install langchain && \
    pip install posthog && \
    pip install unstructured && \
    pip install unstructured[pdf] && \
    pip install sentence_transformers && \
    pip install xformers && \
    pip install --upgrade chromadb==0.3.29 && \
    pip install fire

# Ordner für das Modell erstellen
RUN mkdir /app/usedModel

# generate.py ausführen
CMD ["/bin/bash", "-c", "source activate h2ogpt && python /app/h2ogpt/generate.py --share=False --gradio_offline_level=1 --base_model=/app/usedModel --score_model=None --load_4bit=True --prompt_type=human_bot --langchain_mode=MyData"]