Hugging Faceの「intfloat/multilingual-e5-base」を使うはずが、
SSLの証明書エラーにハマってしまいました…。
requests.exceptions.SSLError: (MaxRetryError("HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /intfloat/multilingual-e5-base/resolve/main/config.json
SSL証明書のエラーに関しては以下のGitHubで議論されています。
https://github.com/huggingface/transformers/issues/17611
上記で書かれているようにSSL証明書の検証を無視するようなアプローチを中心に
色々と試したのですがエラーは解消されず…
そのため、エラー解消は諦めてローカルにモデルをダウンロードして使う方法に変えたいと思います。
ローカルでの動かし方は以下の記事を参考にさせていただきました。
https://qiita.com/matntntn/items/7cdca4f33ce03970ef20
ちなみに私の環境はWSL2の上にUbuntuを構築し、そこでDockerコンテナを立てている状態です。
そのコンテナ内にHugging Faceをダウンロードするアプローチになります。
(WSL2のネットワークの関係や何かの設定不備によるSSLエラーかもしれませんが、
社内ネットワークということもあって、諦めます…)
1. コンテナ内でsentence_transformersをインストール
まずはモデルをダウンロードするコンテナに入り、ライブラリをインストールします。
pip install sentence_transformers
2. Hugging Faceからモデルをダウンロード
以下のコードを実行してモデルをダウンロードします。
違うモデルをダウンロードしたい場合は「model_name」を変更します。
実行後、ターミナルの進捗が途中で止まっても、正常にダウンロードできている場合があります。
別のターミナルを開いて再度以下のコードを実行すると、正常に終了すると思います。
from huggingface_hub import snapshot_download
def model_download():
model_name = "intfloat/multilingual-e5-base"
download_path = snapshot_download(
repo_id=model_name,
local_dir = f"model/{model_name}",
local_dir_use_symlinks=False
)
print(download_path)
if __name__ == "__main__":
hugging_download()
こんな感じでモデルがダウンロードされます。
3. 動作確認
ダウンロードしたモデルを指定して、ベクトル化できるかどうかを確認します。
※WSL2上のDockerコンテナでは「指定したパスは存在しない」といったエラーになったので
絶対パスで指定したらうまく動作しました。ローカルは以下のコードで動きました。
from sentence_transformers import SentenceTransformer
model_name = "intfloat/multilingual-e5-base"
model_path = f"model/{model_name}"
model = SentenceTransformer(model_path)
# 動作確認
embedding = model.encode('ベクトル化したい内容')
print(embedding)
出力結果を確認すると、ベクトル化できていそうですね。
最後に
もともとSSL証明書エラーになった原因は不明のまま、別のアプローチを実施してうまくいきました。
証明書の検証をスキップするのはセキュリティ的にも微妙なので、
今回のようにローカルにダウンロードしてから使うという方法でもいいのかなと思っています。
同じようなエラーに陥った人の何かのお役に立てれば幸いです。