富岳でSuPar-UniDicをムリヤリ動かすには

[昨日の記事](https://qiita.com/KoichiYasuoka/items/8dcd9d6e1687c05567f7)で書いた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](https://pypi.org/project/torch/2.2.0/)に入れ替えた上、`TOKENIZERS_PARALLELISM=false`で[tokenizerをなだめつつ](https://qiita.com/KoichiYasuoka/items/545e6eefcd7a41737eec)、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(動詞補助成分)


ここで -(斜格補語)-> 始めて
人間と -(斜格補語)-> いう
いう -(連体修飾節)-> ものを
吾輩は -(主語)-> 見た
始めて -(連用修飾節)-> 見た
ものを -(目的語)-> 見た
```

[単語間係り受け](http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/kakariuke.html#3)も[二文節間係り受け](http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/kakariuke.html#2)も、ちゃんと解析できているようだ。ただ、このやり方だと、manylinux2014_aarch64のバイナリをそのまま使ってしまうため、富岳のa64fxがイマイチ生かせていない。また、rustのスレッド周りを避けてしまっているので、tokenizersが遅くなってしまっている。[py-torch](https://packages.spack.io/package.html?name=py-torch)や[py-tokenizers](https://packages.spack.io/package.html?name=py-tokenizers)の最新版を`fcc`(富岳の`gcc`もどき)に合わせつつ、`USE_LAPACK=1`で`spack install`すればいいのだろうけど、ちょっと私の手には余る感じだ。誰か代わりにやってくれないかなあ。