NLP ツール - UIE オフライン環境での使用
0.UIEについて
UIE モデルは、Baidu が今年オープンソース化した新しいモデルで、ゼロショットに適用できます。強力で使いやすいです。NLP を新しい段階に引き上げるものではありませんが、基本的な NLP タスクのエンジニアリング使用の敷居を大幅に下げます。非常に効果的なツールです。
公式 git で提供されている使用方法では、数行の簡単なコードを使用して、UIE を使用して予測を行う方法が紹介されています。
>>> from pprint import pprint
>>> from paddlenlp import Taskflow
>>> schema = ['时间', '选手', '赛事名称'] # Define the schema for entity extraction
>>> ie = Taskflow('information_extraction', schema=schema)
>>> pprint(ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!")) # Better print results using pprint
[{
'时间': [{
'end': 6,
'probability': 0.9857378532924486,
'start': 0,
'text': '2月8日上午'}],
'赛事名称': [{
'end': 23,
'probability': 0.8503089953268272,
'start': 6,
'text': '北京冬奥会自由式滑雪女子大跳台决赛'}],
'选手': [{
'end': 31,
'probability': 0.8981548639781138,
'start': 28,
'text': '谷爱凌'}]}]
1 行のコードを使用して推論に使用できるモデルを直接作成することは、ネットワーク環境では非常に便利ですが、シナリオによっては、オフライン環境に展開する必要があります。この記事では、ネットワークのない環境で UIE モデルを使用する方法を紹介します。
私自身はほとんど paddle を使わないのですが、 paddle でのモデル作成はメソッドを使ってモデルを作成できることをうろ覚えでしたので、そのモジュールfrom_pretrained
から paddle のコードロジックを借用しているのではないかと疑うのですが、 paddle のコードとロジックについては見慣れているので、 paddle のロジックに従って適用してみることにしました。transformers
transformers
transformers
paddle
基本的なロジックは、モデルはまず入力文字列がローカル パスであると想定し、次にこのパスを検索してモデルを作成しようとします。失敗した場合、その文字列はモデルの名前であるとみなされ、URL リンクが結合されてモデルを取得してローカル キャッシュに保存し、同時にマーキング用の md5 コードを割り当てます。
- 特定のプロセスに興味がない場合は、パート 2に直接進んでください。
- 詳しい流れを知りたい方は直接読んでみてください。
1. UIEのオフライン利用について詳しく解説
まず、paddlenlp をインストールします
pip install paddlenlp==2.3.4
公式コードを見ると、paddlenlp がタスクフローを使用してモデルを作成していることがわかりますが、名前から、これは UIE を含むさまざまなモデルと互換性のあるクラスであることがわかりますので、ここから uie を取り出す必要があります。これは、モデルをダウンロードしてローカルに保存し、モデルをインスタンス化するという 2 つのステップにすぎません。
taskflow.py
クラスを入力しTaskflow
、そのコンストラクターを見つけます。クラスがどのようなものであっても、コンストラクター内でインスタンス化する必要があります。コンストラクターのロジックを見てみましょう。
def __init__(self, task, model=None, mode=None, device_id=0, **kwargs):
assert task in TASKS, "The task name:{} is not in Taskflow list, please check your task name.".format(
task)
self.task = task
if self.task in ["word_segmentation", "ner"]:
tag = "modes"
ind_tag = "mode"
self.model = mode
else:
tag = "models"
ind_tag = "model"
self.model = model
if self.model is not None:
assert self.model in set(TASKS[task][tag].keys(
)), "The {} name: {} is not in task:[{}]".format(tag, model, task)
else:
self.model = TASKS[task]['default'][ind_tag]
# 省略余下内容...
TASK
したがって、公式の例では、コードが 2 番目の条件ステートメントの else 分岐に入り、グローバル変数を使用して self.model が作成されていることがわかります。同じ py ファイル内で、 this が表示さTASK
れ、UIE の対応する部分が表示されます。
'information_extraction': {
"models": {
"uie-base": {
"task_class": UIETask,
"hidden_size": 768,
"task_flag": "information_extraction-uie-base"
},
"uie-medium": {
"task_class": UIETask,
"hidden_size": 768,
"task_flag": "information_extraction-uie-medium"
},
"uie-mini": {
"task_class": UIETask,
"hidden_size": 384,
"task_flag": "information_extraction-uie-mini"
},
"uie-micro": {
"task_class": UIETask,
"hidden_size": 384,
"task_flag": "information_extraction-uie-micro"
},
"uie-nano": {
"task_class": UIETask,
"hidden_size": 312,
"task_flag": "information_extraction-uie-nano"
},
"uie-tiny": {
"task_class": UIETask,
"hidden_size": 768,
"task_flag": "information_extraction-uie-tiny"
},
"uie-medical-base": {
"task_class": UIETask,
"hidden_size": 768,
"task_flag": "information_extraction-uie-medical-base"
},
},
"default": {
"model": "uie-base"
}
異なるサイズに対応する事前トレーニング モデルに異なるパラメーターが与えられていることがわかります。この手がかりに従って、UIETask
クラスを見つけてそこにジャンプしますinfomation_extraction.py
。直接表示されるのはクラス プロパティで、UIE の各モデルのダウンロード リンクを見つけます。
class UIETask(Task):
"""
Universal Information Extraction Task.
Args:
task(string): The name of task.
model(string): The model name in the task.
kwargs (dict, optional): Additional keyword arguments passed along to the specific task.
"""
resource_files_names = {
"model_state": "model_state.pdparams",
"model_config": "model_config.json",
"vocab_file": "vocab.txt",
"special_tokens_map": "special_tokens_map.json",
"tokenizer_config": "tokenizer_config.json"
}
# vocab.txt/special_tokens_map.json/tokenizer_config.json are common to the default model.
resource_files_urls = {
"uie-base": {
"model_state": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base_v1.0/model_state.pdparams",
"aeca0ed2ccf003f4e9c6160363327c9b"
],
"model_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/model_config.json",
"a36c185bfc17a83b6cfef6f98b29c909"
],
"vocab_file": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt",
"1c1c1f4fd93c5bed3b4eebec4de976a8"
],
"special_tokens_map": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json",
"8b3fb1023167bb4ab9d70708eb05f6ec"
],
"tokenizer_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json",
"59acb0ce78e79180a2491dfd8382b28c"
]
},
# 后边省略
ここでは、これらのリンクを通じて関連するすべてのファイルをダウンロードし、フォルダーに配置し、そのフォルダーを指定します。このパスは、後でインポートするuie
ために使用するパスです。from_pretrained
次に、そのコンストラクターを観察すると、モデルが作成されていないことがわかります。そのため、モデルは親クラスで作成する必要があります。そこで、この手がかりに従って でtask.py
その親クラスを見つけTask
、一巡した後、サブクラスに戻り、_construct_model
サブクラスによって書き換えられたメソッドでモデルを構築したことがわかりました。このようにして、UIETask
に戻り、その受信名をローカル パス (作成したばかりの各モデル ファイルを含むディレクトリのパス) に_construct_model
書き込む方法を見つけました。from_pretrained
def _construct_model(self, model):
"""
Construct the inference model for the predictor.
"""
# model_instance = UIE.from_pretrained(self._task_path)
# 把这里的目录写死为刚刚下载的模型文件所在的目录
model_instance = UIE.from_pretrained({
your_model_path})
self._model = model_instance
self._model.eval()
このようにして、モデルはファイルをローカルで見つけた後、オンラインでダウンロードしようとしません。
本来ならここで終わるはずだったのですが、実行後にエラーが報告されました。再度確認したところ、どうやらローカルファイルを使用させたくないようでした。クラスにはmd5コードを検証するチェック機構があり、ファイルをダウンロードする際にこれを意識しなかったためにチェックに失敗しました。ファイルをダウンロードしていないものと思い込み、インターネットにダウンロードを要求していましpaddle
たTask
。したがって、それをコメントアウトするだけです。
ではUIETask
、チェック行をコメントアウトできます。
def __init__(self, task, model, schema, **kwargs):
super().__init__(task=task, model=model, **kwargs)
self._schema_tree = None
self.set_schema(schema)
# 就是这里,把下面这行注释掉
# self._check_task_files()
self._construct_tokenizer()
self._check_predictor_type()
self._get_inference_model()
self._usage = usage
self._max_seq_len = self.kwargs[
'max_seq_len'] if 'max_seq_len' in self.kwargs else 512
self._batch_size = self.kwargs[
'batch_size'] if 'batch_size' in self.kwargs else 64
self._split_sentence = self.kwargs[
'split_sentence'] if 'split_sentence' in self.kwargs else False
self._position_prob = self.kwargs[
'position_prob'] if 'position_prob' in self.kwargs else 0.5
self._lazy_load = self.kwargs[
'lazy_load'] if 'lazy_load' in self.kwargs else False
self._num_workers = self.kwargs[
'num_workers'] if 'num_workers' in self.kwargs else 0
その後、元のステートメントを通じて、モデルをオフラインで作成できます。
ie = Taskflow('information_extraction', schema=schema)
2. まとめ
今の説明は文字数が多いので、直接読みたくない学生はここにジャンプしてください。
2.1 ファイルをダウンロードする
最初のステップは、ディレクトリを作成し、ダウンロードしたモデルをこのディレクトリに配置することです。必要なモデルをダウンロードするだけですが、ファイルは完全である必要があります。たとえば、ベース モデルを使用したい場合は、すべてのuie-base
ファイルをダウンロードして、このディレクトリに配置する必要があります。
ダウンロードパスは以下のとおりです。
resource_files_urls = {
"uie-base": {
"model_state": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base_v1.0/model_state.pdparams",
"aeca0ed2ccf003f4e9c6160363327c9b"
],
"model_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/model_config.json",
"a36c185bfc17a83b6cfef6f98b29c909"
],
"vocab_file": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt",
"1c1c1f4fd93c5bed3b4eebec4de976a8"
],
"special_tokens_map": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json",
"8b3fb1023167bb4ab9d70708eb05f6ec"
],
"tokenizer_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json",
"59acb0ce78e79180a2491dfd8382b28c"
]
},
"uie-medium": {
"model_state": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_medium_v1.0/model_state.pdparams",
"15874e4e76d05bc6de64cc69717f172e"
],
"model_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_medium/model_config.json",
"6f1ee399398d4f218450fbbf5f212b15"
],
"vocab_file": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt",
"1c1c1f4fd93c5bed3b4eebec4de976a8"
],
"special_tokens_map": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json",
"8b3fb1023167bb4ab9d70708eb05f6ec"
],
"tokenizer_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json",
"59acb0ce78e79180a2491dfd8382b28c"
]
},
"uie-mini": {
"model_state": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_mini_v1.0/model_state.pdparams",
"f7b493aae84be3c107a6b4ada660ce2e"
],
"model_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_mini/model_config.json",
"9229ce0a9d599de4602c97324747682f"
],
"vocab_file": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt",
"1c1c1f4fd93c5bed3b4eebec4de976a8"
],
"special_tokens_map": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json",
"8b3fb1023167bb4ab9d70708eb05f6ec"
],
"tokenizer_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json",
"59acb0ce78e79180a2491dfd8382b28c"
]
},
"uie-micro": {
"model_state": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_micro_v1.0/model_state.pdparams",
"80baf49c7f853ab31ac67802104f3f15"
],
"model_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_micro/model_config.json",
"07ef444420c3ab474f9270a1027f6da5"
],
"vocab_file": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt",
"1c1c1f4fd93c5bed3b4eebec4de976a8"
],
"special_tokens_map": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json",
"8b3fb1023167bb4ab9d70708eb05f6ec"
],
"tokenizer_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json",
"59acb0ce78e79180a2491dfd8382b28c"
]
},
"uie-nano": {
"model_state": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_nano_v1.0/model_state.pdparams",
"ba934463c5cd801f46571f2588543700"
],
"model_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_nano/model_config.json",
"e3a9842edf8329ccdd0cf6039cf0a8f8"
],
"vocab_file": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt",
"1c1c1f4fd93c5bed3b4eebec4de976a8"
],
"special_tokens_map": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json",
"8b3fb1023167bb4ab9d70708eb05f6ec"
],
"tokenizer_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json",
"59acb0ce78e79180a2491dfd8382b28c"
]
},
# Rename to `uie-medium` and the name of `uie-tiny` will be deprecated in future.
"uie-tiny": {
"model_state": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_tiny_v0.1/model_state.pdparams",
"15874e4e76d05bc6de64cc69717f172e"
],
"model_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_tiny/model_config.json",
"6f1ee399398d4f218450fbbf5f212b15"
],
"vocab_file": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt",
"1c1c1f4fd93c5bed3b4eebec4de976a8"
],
"special_tokens_map": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json",
"8b3fb1023167bb4ab9d70708eb05f6ec"
],
"tokenizer_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json",
"59acb0ce78e79180a2491dfd8382b28c"
]
},
"uie-medical-base": {
"model_state": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_medical_base_v0.1/model_state.pdparams",
"569b4bc1abf80eedcdad5a6e774d46bf"
],
"model_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/model_config.json",
"a36c185bfc17a83b6cfef6f98b29c909"
],
"vocab_file": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt",
"1c1c1f4fd93c5bed3b4eebec4de976a8"
],
"special_tokens_map": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json",
"8b3fb1023167bb4ab9d70708eb05f6ec"
],
"tokenizer_config": [
"https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json",
"59acb0ce78e79180a2491dfd8382b28c"
]
}
}
2.2 ロードしたファイルのアドレスを変更する
モデル ファイルをダウンロードしてフォルダーに配置しました。次に、このフォルダーのパスを覚えて、paddlenlp でそれを見つける必要があります。information_extraction.py
このファイルは通常、のディレクトリにありますsite-packages
。見つからない場合は、直接検索できます。約 290 行が見つかり、参照ディレクトリを作成したばかりのモデルのパスに変更しました。paddlenlp
taskflow
def _construct_model(self, model):
"""
Construct the inference model for the predictor.
"""
# model_instance = UIE.from_pretrained(self._task_path)
# 把这里的目录写死为刚刚下载的模型文件所在的目录
model_instance = UIE.from_pretrained({
your_model_path})
self._model = model_instance
self._model.eval()
2.3 ソースコードでチェックしたコードをコメントアウトする
最終的にinformation_extraction.py
、約 248 行を見つけてself._check_task_files()をコメントアウトしました。
def __init__(self, task, model, schema, **kwargs):
super().__init__(task=task, model=model, **kwargs)
self._schema_tree = None
self.set_schema(schema)
# 就是这里,把下面这行注释掉
# self._check_task_files()
self._construct_tokenizer()
ここまでで完了です。
ご質問がございましたら、メッセージを残してください。次回お会いしましょう。