昨日の記事で書いたSuPar-UniDicによる係り受けプログラムを、スーパーコンピュータ「富岳」のPyTorch-1.13.0で動かすことを試みた。しかし、富岳のPyTorch-1.13.0はコンパイル時にUSE_LAPACK=1
を指定していないらしく、torch.nn.init.orthogonal_()
まわりで
File "/vol0004/apps/oss/spack-v0.19/opt/spack/linux-rhel8-a64fx/fj-4.8.1/py-torch-1.13.0-glqavnhys6plsjklw2bp3tkkh5ysyrqh/lib/python3.10/site-packages/torch/nn/init.py", line 484, in orthogonal_
q, r = torch.linalg.qr(flattened)
RuntimeError: Calling torch.geqrf on a CPU tensor requires compiling PyTorch with LAPACK. Please use PyTorch built with LAPACK support.
という悲しいエラーが出て、動かすことができなかった。仕方ないので、富岳のPyTorchを最新のPyTorch-2.2.0に入れ替えた上、TOKENIZERS_PARALLELISM=false
でtokenizerをなだめつつ、SuPar-UniDicを動かすことにした。
#! /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-numpy@1.23.4/hcqp4u5
G=`id | sed 's/^.*gid=[0-9]*(\([^)]*\)).*$/\1/'`
set `ls -d /vol*/$G /vol*/data/$G` $HOME
export PYTHONUSERBASE=$1/SuPar-UniDic
export PATH=$PYTHONUSERBASE/bin:$PATH
export TMPDIR=$PYTHONUSERBASE/tmp
mkdir -p $TMPDIR
pip3 install -U torch typing_extensions --user
pip3 install -U suparunidic --user
P=$TMPDIR/suparunidic.$PJM_JOBID.$$.py
cat << 'EOF' > $P
import suparunidic
nlp=suparunidic.load()
doc=nlp("吾輩はここで始めて人間というものを見た")
import deplacy
print(deplacy.to_conllu(doc))
deplacy.render(doc,Japanese=True)
print("\n")
from suparunidic 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
env TOKENIZERS_PARALLELISM=false python3 $P
富岳のログインノードからpjsub
してみたところ、ジョブ待ち・インストール・ダウンロード等も含め、20分ほどで以下の結果が得られた。
1 吾輩 我が輩 PRON 代名詞 _ 12 nsubj _ SpaceAfter=No|Translit=ワガハイ
2 は は ADP 助詞-係助詞 _ 1 case _ SpaceAfter=No|Translit=ワ
3 ここ 此処 PRON 代名詞 _ 5 obl _ SpaceAfter=No|Translit=ココ
4 で で ADP 助詞-格助詞 _ 3 case _ SpaceAfter=No|Translit=デ
5 始め 始める VERB 動詞-非自立可能 _ 12 advcl _ SpaceAfter=No|Translit=ハジメ
6 て て SCONJ 助詞-接続助詞 _ 5 mark _ SpaceAfter=No|Translit=テ
7 人間 人間 NOUN 名詞-普通名詞-一般 _ 9 obl _ SpaceAfter=No|Translit=ニンゲン
8 と と ADP 助詞-格助詞 _ 7 case _ SpaceAfter=No|Translit=ト
9 いう 言う VERB 動詞-一般 _ 10 acl _ SpaceAfter=No|Translit=ユー
10 もの 物 NOUN 名詞-普通名詞-サ変可能 _ 12 obj _ SpaceAfter=No|Translit=モノ
11 を を ADP 助詞-格助詞 _ 10 case _ SpaceAfter=No|Translit=オ
12 見 見る VERB 動詞-非自立可能 _ 0 ROOT _ SpaceAfter=No|Translit=ミ
13 た た AUX 助動詞 _ 12 aux _ SpaceAfter=No|Translit=タ
吾輩 PRON ═╗<════════╗ nsubj(主語)
は ADP <╝ ║ case(格表示)
ここ PRON ═╗<╗ ║ obl(斜格補語)
で ADP <╝ ║ ║ case(格表示)
始め VERB ═╗═╝<════╗ ║ advcl(連用修飾節)
て SCONJ <╝ ║ ║ mark(標識)
人間 NOUN ═╗<╗ ║ ║ obl(斜格補語)
と ADP <╝ ║ ║ ║ case(格表示)
いう VERB ═══╝<╗ ║ ║ acl(連体修飾節)
もの NOUN ═╗═══╝<╗ ║ ║ obj(目的語)
を ADP <╝ ║ ║ ║ case(格表示)
見 VERB ═╗═════╝═╝═╝ ROOT(親)
た AUX <╝ aux(動詞補助成分)
ここで -(斜格補語)-> 始めて
人間と -(斜格補語)-> いう
いう -(連体修飾節)-> ものを
吾輩は -(主語)-> 見た
始めて -(連用修飾節)-> 見た
ものを -(目的語)-> 見た
単語間係り受けも二文節間係り受けも、ちゃんと解析できているようだ。ただ、このやり方だと、manylinux2014_aarch64のバイナリをそのまま使ってしまうため、富岳のa64fxがイマイチ生かせていない。また、rustのスレッド周りを避けてしまっているので、tokenizersが遅くなってしまっている。py-torchやpy-tokenizersの最新版をfcc
(富岳のgcc
もどき)に合わせつつ、USE_LAPACK=1
でspack install
すればいいのだろうけど、ちょっと私の手には余る感じだ。誰か代わりにやってくれないかなあ。