LoginSignup
1
1

エンティティリンキングシステム「BLINK」の使用環境構築メモ

Last updated at Posted at 2022-06-29

BLINKとは?

  • リポジトリ:https://github.com/facebookresearch/BLINK
  • エンティティリンキングを行うためのシステム
  • 高速だが精度に劣るバイエンコーダというモデルと、精度は高いが速度は遅いクロスエンコーダというモデルの2つ(両方ともBERTを使用)を組み合わせてエンティティリンキングを行う
  • エンティティリンキングの手がかりとして、エンティティを説明するディスクリプション(+エンティティ名)と文章中のエンティティメンション(+その周囲の文脈)しか使わないことが特徴
  • 詳しくは、右の論文を参照:Scalable Zero-shot Entity Linking with Dense Entity Retrieval

環境

  • OS:Linux 4.18.0-240.1.1.el8_3.x86_64
    • pyenvインストール済み
  • GPU:GeForce RTX 3090×2
  • cat /proc/driver/nvidia/version
    • NVRM version: NVIDIA UNIX x86_64 Kernel Module 460.27.04 Fri Dec 11 23:35:05 UTC 2020
    • GCC version: gcc バージョン 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)
  • /usr/local/cuda/bin/nvcc --version
    • nvcc: NVIDIA (R) Cuda compiler driver
      Copyright (c) 2005-2020 NVIDIA Corporation
      Built on Tue_Sep_15_19:10:02_PDT_2020
      Cuda compilation tools, release 11.1, V11.1.74
      Build cuda_11.1.TC455_06.29069683_0
      

やったこと

  1. pyenvでanaconda (Python3系) をインストール - Qiitaを参考に、pyenvでanaconda3-5.3.1をインストール
  2. 元のリポジトリのREADMEを見て、使用の準備をする
    • conda activateコマンドが使えない場合は、表示されたエラーメッセージ通りにコマンドを実行する
      • 自分の場合はecho ". /home/<ユーザ名>/.pyenv/versions/anaconda3-5.3.1/etc/profile.d/conda.sh" >> ~/.bashrcを実行
  3. python blink/main_dense.py -iを実行してモジュールが見つからないと怒られたので、ModuleNotFoundError/ No module named 'blink' · Issue #18 · facebookresearch/BLINKを参考にPYTHONPATH=. python blink/main_dense.py -iを実行した
  4. インストールされているPyTorchのバージョンが搭載されているGPUに対応していない(?)と怒られた。torch.cuda.get_arch_list() = ['sm_37', 'sm_50', 'sm_60', 'sm_70', 'sm_75']torch.version.cuda = 10.2という状況で、以下がエラー文
    UserWarning: 
    GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.
    The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70 sm_75.
    If you want to use the GeForce RTX 3090 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
    
      warnings.warn(incompatible_device_warn.format(device_name, capability, " ".join(arch_list), device_name))
    ...
    RuntimeError: CUDA error: no kernel image is available for execution on the device
    
  5. 「torch 1.6.0 sm_86」などで検索してヒットした以下のページを参考に、PyTorchの公式サイトを見てpip install torch==1.7.0+cu110 torchvision==0.8.0+cu110 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.htmlを実行した
  6. torchvision==0.8.0+cu110を満たすバージョンが見つからないと怒られたので、pip install torch==1.7.0+cu110 torchvision==0.8.0 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.htmlを実行した
  7. 再度PYTHONPATH=. python blink/main_dense.py -iを実行したら、以下のエラーが出た
    AttributeError: 'KeyedVectors' object has no attribute 'key_to_index'
    
  8. 「'KeyedVectors' object has no attribute 'key_to_index' blink」で検索してヒットした'KeyedVectors' object has no attribute 'key_to_index' · Issue #81 · facebookresearch/BLINKを参考に、pip install gensim==3.5.0を実行した
  9. 再度PYTHONPATH=. python blink/main_dense.py -iを実行して、無事BLINKがインタラクティブモードで動くことを確認
  10. バイエンコーダのためにFAISS indexerを使いたい場合は、PYTHONPATH=. python blink/build_faiss_index.py --output_path models/faiss_flat_index.pkl --save_indexを実行してインデックスをビルドする
    • 元のリポジトリのREADMEに書いてあるコマンドに--save_indexオプションを加えないと、ビルドしたFAISS indexが保存されない
    • ビルドが終わったら、元のREADMEを参考にPYTHONPATH=. python blink/main_dense.py -i --faiss_index flat --index_path models/faiss_flat_index.pklを実行すると、FAISS indexerを使用した状態でBLINKが動く

プログラムから呼び出す編

  • やったこと内の使用環境構築が終わっていることを前提とする
  1. BLINKディレクトリの1つ上に移動して、pip install -e ./BLINKを実行
  2. BLINKディレクトリ内に、元のリポジトリのREADMEに載っているサンプルコードと同じ内容のPythonファイルを作成
  3. 上のファイル内の"models/""./models/"に変更
  4. カレントディレクトリがBLINKディレクトリであることを確認し、python blink_test.pyを実行する
  5. 上のコードを実行すると、終了までに5分ほどかかった
    • デバッガで確認してみると、predictions変数に各メンションに対するリンキング結果が格納されていることが分かる

以上

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1