🎉

LLM開発のための環境構築

2024/03/22に公開
1

はじめに

株式会社Elithの大森一祥です。AIテックカンパニーの一員として、お客様の課題をAIを駆使して解決しています。

大規模言語モデル(LLM)が人間と匹敵する性能を発揮することもあり、弊社には多岐にわたるプロジェクトの依頼が寄せられています。最近は、情報漏洩のリスクを回避するため、独自のLLMの開発を希望されることが多いです。このような案件では、一般に公開されたモデル(ローカルLLM)を利用します。

ローカルLLMを活用して課題を解決する方法として、以下の4つが挙げられます。

  1. プロンプトエンジニアリング:LLMに特定の出力を生成させるための入力文の工夫する手法
  2. RAG:外部の文章データベースから、質問に類似した文章を取り出しLLMの入力として用いる手法
  3. インストラクションチューニング:ユーザの指示に沿った出力を生成することを目的としたチューニング手法
  4. 継続事前学習:LLMモデルに対して追加で事前学習する手法

継続事前学習は莫大なデータで学習するため並列化技術が必須となり、環境構築でとてもハマりやすいです。本記事では、ローカルLLMを継続事前学習する際の開発環境構築において、Dockerとpyenvを用いた2つのアプローチを紹介します。

本記事で利用するスクリプトは以下のGitHubリポジトリで管理しています。

https://github.com/oriki101/dev-llm

Dockerを用いた環境構築

Dockerは、開発環境を簡単に共有できる仮想化技術です。まだ、Dockerをインストールされていない方は、NVIDIA Dockerの最新情報を参照してインストールしてください。環境構築に必要なファイルは、GitHubリポジトリのdockerディレクトリ内に格納されています。

Dockerについて詳しく知りたい方は以下のリンクを確認してください

https://docs.docker.com/get-started/overview/

Dockerイメージの作成

Docker環境を準備したら、LLM用のDockerイメージを作成しましょう。Dockerイメージを作成するための定義書はDockerfileになります。今回は以下のように定義しています。

FROM gcr.io/kaggle-gpu-images/python:v141

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo

ENV NVIDIA_VISIBLE_DEVICES all
ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64
EXPOSE 9001
EXPOSE 8888

RUN pip install japanize-matplotlib mlflow logzero timm pandarallel optuna gdown lap

RUN pip install pandas==1.5.2 keplergl==0.3.2 mkl fancyimpute
RUN cp /opt/conda/pkgs/mkl-2023.1.0-h213fc3f_46344/lib/libmk* /usr/local/cuda/lib64

RUN pip install black isort
RUN pip install jupyter_contrib_nbextensions jupyterlab_code_formatter
RUN pip install wandb openai

# torchのバージョンが古いのでアップデート
# RUN pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2
RUN pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cu118

# パラメータ管理用
RUN pip install omegaconf

# デフォルトではエラーで動かなかったためバージョン変更
RUN pip install datasets==2.14.7

# DeepSpeed
RUN apt-get update --allow-releaseinfo-change -y && apt-get install -y \
    libopenmpi-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
RUN pip install mpi4py
RUN pip install deepspeed==0.13.1

# jupyter labの表示バグ対策
RUN pip install ipywidgets==8.0.4

RUN mkdir -p $HOME/.jupyter/lab/user-settings/@jupyterlab/notebook-extension/ \
    && mkdir -p $HOME/.jupyter/lab/user-settings/@jupyterlab/terminal-extension \
    && mkdir -p $HOME/.local/share/code-server/User

# set jupyterlab config  
RUN echo '\n\
{ \n\
    "codeCellConfig": { \n\
        "autoClosingBrackets": true, \n\
        "lineNumbers": true \n\
    } \n\
} \n\
' > $HOME/.jupyter/lab/user-settings/@jupyterlab/notebook-extension/tracker.jupyterlab-settings

今回作成するDockerイメージは、Kaggleで利用されるDockerイメージをもとに環境構築しているため、LLM以外にもデータ分析、深層学習モデルの開発など多岐にわたって利用できます。

Dockerfileができましたら、Dockerイメージを作成するためのシェルスクリプトを作成し、実行してください。

#!/bin/bash
IMAGE_NAME="dev-llm:v141" # Dockerイメージの名前
docker build . -t ${IMAGE_NAME}

GitHubリポジトリからDockerイメージを作成する場合は以下の手順になります。この作業には少し時間がかかります。

git clone https://github.com/oriki101/dev-llm.git # このリポジトリをクローン
cd dev-llm/docker
./build.sh # イメージを作成

実行権限がない場合は、chmod コマンドを使って適切な権限を付与してください。

Dockerイメージからコンテナを起動

コンテナ起動に関わる設定はdocker-compose.ymlファイルで管理されます。以下が設定例です。

version: '3'
services:
  kaggle:
    restart: always
    image: dev-llm:v141
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ../../dev-llm:/kaggle/dev-llm
    container_name: LLM 
    tty: true
    ports: 
      - '8888:8888'
    command: jupyter-lab --ip 0.0.0.0 --port=8888 --allow-root --no-browser --NotebookApp.token=''
    working_dir: /kaggle
    shm_size: '256gb'
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

作成したDockerイメージからコンテナを起動するには、以下のコマンドを実行します。

docker compose up

コンテナへのアクセス

ターミナルからDocker環境に入るために以下のコマンドを実行してください。

$ docker exec -it LLM bash

上記のコマンドは継続事前学習を実行する際に必要です。

JupyterLabへのアクセス

コンテナを起動すると、JupyterLabが自動的に起動します。これにより、ブラウザベースのインターフェイスを通じてインタラクティブな開発環境を利用できます。

  • ローカル環境でのアクセス方法: ローカルPCでDockerコンテナを実行している場合、任意のウェブブラウザを開き、アドレスバーに localhost:8888 と入力してEnterキーを押してください。これにより、JupyterLabのホーム画面が表示されます。
  • リモート環境でのアクセス方法: リモートPCやサーバー上でDockerコンテナを実行している場合、そのマシンのIPアドレスを確認し、ブラウザのアドレスバーに IPアドレス:8888 の形式で入力してアクセスしてください(例:192.168.1.5:8888)。これにより、リモート環境においてもJupyterLabにアクセスできます。

pyenvを用いた環境構築

次に、pyenvを用いた環境構築について説明します。クラウド環境において、パフォーマンスを最適化する目的で、Dockerの使用を避け、直接システム上に開発環境を構築することが推奨される場合があります。このような状況で、pyenvを用いると、Pythonのバージョン管理が容易になり、必要に応じたPython環境の構築が可能です。

以下のコマンドを実行することで、環境を構築できます。

$ python3 -m venv llm-env # Python環境の構築
$ source llm-env/bin/activate # 作成した環境のアクティベーション
$ cd dev-llm/pyenv
$ pip install -r requirements.txt

こちらで作成した環境は、ABCIクラウドシステムで継続事前学習を実施する際に利用しました。

おわりに

本記事では、LLMをチューニングするための開発環境についてまとめました。LLMチューニング用の環境構築に苦戦している方の助けになれば幸いです。

以下のLLMを継続事前学習する記事の環境としても使えますので、ぜひ利用してください。
https://zenn.dev/elith/articles/30c25fa0c6a0c1

最後に宣伝となりますが、株式会社 Elith は最先端のAI技術をビジネスに実装し、価値を生み出すテックカンパニーです。

最近では、医療用LLMの作成など、LLMを活用した社会課題解決に向けて作業しています。

LLMを活用したビジネス課題解決に興味がある方は、X(旧Twitter)経由やElithのWebページ経由で、是非気軽にお尋ねください。

株式会社Elith

Discussion