スーパーコンピュータ「富岳」のspack0.19版python3.10で、tokenizersが動かない理由は、rustのスレッド周りにある。これをムリヤリ回避するには、tokenizersにスレッドを使わせないようTOKENIZERS_PARALLELISM=false
すれば、何とかtransformersが動く。Swallow-7b-instruct-hfに「パソコンのキーボードは,なぜABC順・五十音順ではないのですか」と尋ねてみよう。
#! /bin/bash
#PJM -L rscgrp=small
#PJM -L elapse=1:00:00
#PJM -L node=1
#PJM -j
#PJM -S
. /vol0004/apps/oss/spack/share/spack/setup-env.sh
spack load py-torch@1.13.0/glqavnh
G=`id | sed 's/^.*gid=[0-9]*(\([^)]*\)).*$/\1/'`
set `ls -d /vol*/$G /vol*/data/$G` $HOME
export PYTHONUSERBASE=$1/Swallow
export PATH=$PYTHONUSERBASE/bin:$PATH
export HF_HOME=$PYTHONUSERBASE
export TMPDIR=$PYTHONUSERBASE/tmp
mkdir -p $TMPDIR
pip3 install -U transformers accelerate sentencepiece tqdm typing_extensions --user
P=$TMPDIR/swallow.$PJM_JOBID.$$.py
cat << 'EOF' > $P
from transformers import LlamaForCausalLM,LlamaTokenizer,TextGenerationPipeline
mdl=LlamaForCausalLM.from_pretrained("tokyotech-llm/Swallow-7b-instruct-hf",low_cpu_mem_usage=True)
tkz=LlamaTokenizer.from_pretrained("tokyotech-llm/Swallow-7b-instruct-hf")
tgn=TextGenerationPipeline(model=mdl,tokenizer=tkz,max_new_tokens=128)
nlp=lambda txt:tgn(f"以下に、あるタスクを説明する指示があります。リクエストを適切に完了するための回答を記述してください。\n\n### 指示:{txt}\n\n### 応答:",do_sample=True)[0]["generated_text"]
print(nlp("パソコンのキーボードは,なぜABC順・五十音順ではないのですか"))
EOF
env TOKENIZERS_PARALLELISM=false python3 $P
富岳のログインノードからpjsub
してみたところ、ジョブ待ち・インストール・ダウンロード等も含め、30分ほどで以下の結果が得られた。
以下に、あるタスクを説明する指示があります。リクエストを適切に完了するための回答を記述してください。
### 指示:パソコンのキーボードは,なぜABC順・五十音順ではないのですか
### 応答:キーボードの配列は、使用頻度の高いキーを中心に、英語圏の人にとって効率的に入力できるように設計されています。アルファベット順に並んでいないのは、キーボードには多くの文字があり、アルファベット順に並べると、キーボードのスペースが不足するからです。
12月22日の記事とは微妙に異なる結果だが、とりあえず7bモデルなら、富岳1ノードで十分ということだ。さて、13bモデルや70bモデルも、この手法で動かせるのかな。