昨日の記事で書いたja-ginza-bert-large (β版)のプログラムを、スーパーコンピュータ「富岳」のspack0.19版python3.10に移植することを考えた。移植でツライのはSudachiPyで、富岳のrust1.60.0ではコンパイルしきれない。仕方ないので、rustの公式サイトからnightly toolchainをダウンロードして、RUSTFLAGS='-Z threads=8'
で高速コンパイルに挑戦することにした。
#! /bin/bash
#PJM -L rscgrp=small
#PJM -L elapse=6: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/GiNZA
export TMPDIR=$PYTHONUSERBASE/tmp
export CARGO_HOME=$TMPDIR/cargo
export PATH=$PYTHONUSERBASE/bin:$CARGO_HOME/bin:$PATH
mkdir -p $TMPDIR
pip3 install -U typing-extensions setuptools setuptools-rust deplacy --user
if [ ! -f $CARGO_HOME/bin/cargo ]
then P=$TMPDIR/rustup.$PJM_JOBID.$$.sh
curl -L https://sh.rustup.rs -o $P
sh $P -y --no-modify-path --profile minimal --default-toolchain nightly
ln -s /opt/FJSVxtclanga/tcsds-1.2.36/bin/fcc $CARGO_HOME/bin/gcc
fi
env RUSTFLAGS='-Z threads=8' pip3 install https://github.com/megagonlabs/ginza/releases/download/v5.1.3/ja_ginza_bert_large-5.1.3b1-py3-none-any.whl --user
P=$TMPDIR/ginza.$PJM_JOBID.$$.py
cat << 'EOF' > $P
import spacy
nlp=spacy.load("ja_ginza_bert_large")
doc=nlp("吾輩はここで始めて人間というものを見た")
import deplacy
print(deplacy.to_conllu(doc))
deplacy.render(doc,Japanese=True)
print("\n")
from ginza import bunsetu_span,bunsetu_spans
from deplacy.deprelja import deprelja
for b in bunsetu_spans(doc):
for t in b.lefts:
print(bunsetu_span(t).text,f"-({deprelja[t.dep_]})->",b.text)
EOF
python3 $P
富岳のログインノードからpjsub
してみたところ、ジョブ待ち・ダウンロード・コンパイル等も含め、3時間20分ほどで以下の結果が得られた。
1 吾輩 吾輩 PRON 代名詞 Reading=ワガハイ 12 nsubj _ SpaceAfter=No|Translit=我が輩
2 は は ADP 助詞-係助詞 Reading=ハ 1 case _ SpaceAfter=No
3 ここ ここ PRON 代名詞 Reading=ココ 5 obl _ SpaceAfter=No|Translit=此処
4 で で ADP 助詞-格助詞 Reading=デ 3 case _ SpaceAfter=No
5 始め 始める VERB 動詞-非自立可能 Inflection=下一段-マ行;連用形-一般|Reading=ハジメ 12 advcl _ SpaceAfter=No|Translit=始める
6 て て SCONJ 助詞-接続助詞 Reading=テ 5 mark _ SpaceAfter=No
7 人間 人間 NOUN 名詞-普通名詞-一般 Reading=ニンゲン 10 nmod _ NE=B-Mammal|SpaceAfter=No
8 と と ADP 助詞-格助詞 Reading=ト 7 case _ SpaceAfter=No
9 いう いう VERB 動詞-一般 Inflection=五段-ワア行;連体形-一般|Reading=イウ 8 fixed _ SpaceAfter=No|Translit=言う
10 もの もの NOUN 名詞-普通名詞-サ変可能 Reading=モノ 12 obj _ SpaceAfter=No|Translit=物
11 を を ADP 助詞-格助詞 Reading=ヲ 10 case _ SpaceAfter=No
12 見 見る VERB 動詞-非自立可能 Inflection=上一段-マ行;連用形-一般|Reading=ミ 0 ROOT _ SpaceAfter=No|Translit=見る
13 た た AUX 助動詞 Inflection=助動詞-タ;終止形-一般|Reading=タ 12 aux _ SpaceAfter=No
吾輩 PRON ═╗<════════╗ nsubj(主語)
は ADP <╝ ║ case(格表示)
ここ PRON ═╗<╗ ║ obl(斜格補語)
で ADP <╝ ║ ║ case(格表示)
始め VERB ═╗═╝<════╗ ║ advcl(連用修飾節)
て SCONJ <╝ ║ ║ mark(標識)
人間 NOUN ═══╗<╗ ║ ║ nmod(体言による連体修飾語)
と ADP ═╗<╝ ║ ║ ║ case(格表示)
いう VERB <╝ ║ ║ ║ fixed(固着)
もの NOUN ═╗═══╝<╗ ║ ║ obj(目的語)
を ADP <╝ ║ ║ ║ case(格表示)
見 VERB ═╗═════╝═╝═╝ ROOT(親)
た AUX <╝ aux(動詞補助成分)
ここで -(斜格補語)-> 始めて
人間という -(体言による連体修飾語)-> ものを
吾輩は -(主語)-> 見た
始めて -(連用修飾節)-> 見た
ものを -(目的語)-> 見た
単語間係り受けも二文節間係り受けも、ちゃんと解析できているようだ。ただ、fugashiとSudachiPyの両方をインストールする、ってどう考えても無駄なので、できればGiNZA(というか日本語spaCy)がfugashiでも動くようになれば(実際spaCy 2.2.4あたりまではfugashiだった)、富岳で動かしやすくなるんだけどなあ。それともSudachiPyの方に、manylinux2014_aarch64のwheelをお願いする方がいいのかな。