DeepSeek-OCRが話題になっているのでちょっと試したい
https://note.com/shi3zblog/n/n99bb0c642f1e
https://zenn.dev/kun432/scraps/b86cbb66cea4e7
dockerコンテナを使って、環境構築してみる。
A100持って無くて、3060でも試せます。
環境 ubuntu2204
nvidia 6000 ada(48G) or
nvidia 3060(12G) large(base_size = 1280, image_size = 1280, crop_mode = False)の設定でもスムーズに動きました。Gundam設定(base_size = 1024, image_size = 640, crop_mode = True)でも動作した。
config.pyの設定を変えることで、メモリ少なめのGPUでも動くようなことが記載されています。
●DockerfileはchatGPTで作成し、動作確認をしています。
オリジナルのクローン
以下のオリジナルサイトから、適当なフォルダにクローンする。
https://github.com/deepseek-ai/DeepSeek-OCR
git clone https://github.com/deepseek-ai/DeepSeek-OCR.git
ベースコンテナの選定と設定方針
オリジナルでcuda11.8を使用していることから、
nvidia/cuda:11.8.0-devel-ubuntu22.04
をベースモデルにする。
- コンテナ作成後に、追加ソフトを入れることを想定して、sudoユーザーを作っておく。
- コンテナ内に/codeフォルダを作成し、コンテナ内外からファイルを操作できるようにする。
- コンテナ起動後はVScodeでアタッチする。/codeフォルダを開く。
- GPUの設定はdocker-compose.yml に記述する。
以下、Dockerfileとdocker-compose.ymlを示す。
(別プロジェクトで導入した不要ライブラリが残っているかもしれません)
FROM nvidia/cuda:11.8.0-devel-ubuntu22.04
########################################
# 0. 基本ツール導入と Python 3.12 導入
########################################
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \
DEBIAN_FRONTEND=noninteractive apt-get install -y \
sudo \
software-properties-common \
git wget curl ca-certificates \
build-essential \
cmake ninja-build \
libgl1-mesa-dev \
dialog \
tzdata \
python3-tk && \
rm -rf /var/lib/apt/lists/*
ENV DISPLAY=host.docker.internal:0.0
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
# deadsnakesからPython 3.12系を導入
RUN add-apt-repository ppa:deadsnakes/ppa -y && \
apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
python3.12 python3.12-dev python3.12-venv python3.12-full && \
rm -rf /var/lib/apt/lists/*
# pipをセットアップし、python/pipコマンドを3.12に向ける
RUN python3.12 -m ensurepip && \
python3.12 -m pip install --upgrade pip setuptools wheel && \
update-alternatives --install /usr/bin/python python /usr/bin/python3.12 100 && \
update-alternatives --install /usr/bin/pip pip /usr/local/bin/pip3.12 100 || true
########################################
# 1. sudo権限付きユーザー作成
########################################
ARG USERNAME=user
ARG GROUPNAME=user
ARG UID=1000
ARG GID=1000
ARG PASSWORD=user
RUN groupadd -g $GID $GROUPNAME && \
useradd -m -s /bin/bash -u $UID -g $GID -G sudo $USERNAME && \
echo $USERNAME:$PASSWORD | chpasswd && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
mkdir -p /etc/sudoers.d
########################################
# 2. /code 展開(プロジェクト一式を入れる)
########################################
RUN mkdir -p /code && chown $UID:$GID /code
WORKDIR /code
# ここでホスト側のカレントフォルダを全部投入
# requirements.txt もこのタイミングで入るので、以降のpip installで参照できる
ADD --chown=$USERNAME:$GROUPNAME . /code
########################################
# 3. Python依存を順番にインストール
########################################
# 3-1. CUDA 11.8 対応の PyTorch
RUN pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 \
--index-url https://download.pytorch.org/whl/cu118
# 3-2. あなたの requirements(DeepSeek-OCR の依存一式)
RUN pip install --no-cache-dir -r /code/requirements.txt || true
# 3-2.5 flash-attn が setup 時に必要とする psutil を先行インストール(重要)
# requirements.txt に無い場合でもここで確実に入るようにする
RUN pip install psutil==5.9.8
# 3-3. flash-attn をビルドしてインストール
RUN pip install flash-attn==2.7.3 --no-build-isolation
########################################
# 4. DeepSeek-OCR本体とvLLM
########################################
# DeepSeek-OCR を取得(OCR推論スクリプト / vLLM用スクリプトが入っている)
RUN git clone https://github.com/deepseek-ai/DeepSeek-OCR.git /code/DeepSeek-OCR
# vLLM 0.8.5 (CUDA11.8対応ビルド) をインストール
# DeepSeek-OCRのvLLMモードで利用される組み合わせ。
RUN wget https://github.com/vllm-project/vllm/releases/download/v0.8.5/vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl && \
pip install ./vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl && \
rm vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl
# Hugging Face のモデルキャッシュ置き場
ENV HF_HOME=/code/hf_cache
RUN mkdir -p /code/hf_cache && chown $UID:$GID /code/hf_cache
########################################
# 5. 最終ユーザー切り替えと便利設定
########################################
USER ${UID}
WORKDIR /code
RUN echo 'alias python=python3.12' >> ~/.bashrc && \
echo 'alias pip=pip3' >> ~/.bashrc && \
echo 'echo "Python version:" && python --version && echo "Pip version:" && pip --version' >> ~/.bashrc
CMD ["/bin/bash"]
version: '3'
services:
gpu_6000:
build: .
#command: nvidia-smi
shm_size: '32gb'
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ["0"] # ["0","1"] ["1"] などと記述 GPU1枚なら0
capabilities: [gpu]
mem_limit: 64g # メインメモリを全体の半分に制限 swapは制限しない
volumes:
- .:/code:cached # プロジェクトフォルダを/codeに割り当てる。
tty: true
動作確認
ソースに含まれるPDFファイルで試してみる。
オリジナルに含まれる以下のコードを実行。
/code/DeepSeek-OCR-master/DeepSeek-OCR-vllm/run_dpsk_ocr_pdf.py
入出力の設定は、config.pyに書いてあるので、適当に編集する。
INPUT_PATH = '/code/output/DeepSeek_OCR_paper_layouts.pdf'
OUTPUT_PATH = '/code/output_test'
Large Tiny Gundamなどの処理サイズのバリエーションもここで記述できるようだ。
設定には以下のプロンプトが入っていた。
PROMPT = '\n<|grounding|>Convert the document to markdown.'
読み取り結果のmdファイル。なぜか、mmdという拡張子だった。

テキストが埋め込まれているPDFだと、それを使うみたいだ。テキスト無しのPDFでもうまく行く感じ。
画像を入力するとき
画像を入力したい場合は、INPUT_PATHに画像のパスを入れる。実行ファイルはrun_dpsk_ocr_image.py を使う。
プロンプトは以下のようなものを使う。
PROMPT = '\nDescribe this image in detail.'
ちょっと試したところではプロンプトに日本語使えない。
以上