【问题标题】:Issue while using transformers package inside the docker image在 docker 映像中使用转换器包时出现问题
【发布时间】:2021-06-22 02:46:30
【问题描述】:

我正在使用转换器管道对来自 6 种不同语言的示例文本进行情感分析。我在本地 Jupyterhub 中测试了代码,它运行良好。但是当我将它包装在一个烧瓶应用程序中并从中创建一个 docker 映像时,执行会挂在管道推理线上,并且需要永远返回情绪分数。

  • mac os catalina 10.15.7(无 GPU)
  • Python 版本:3.8
  • 变形金刚包:4.4.2
  • 火炬版本:1.6.0
from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
classifier = pipeline('sentiment-analysis', model=model, tokenizer=tokenizer)
results = classifier(["We are very happy to show you the Transformers library.", "We hope you don't hate it."])
print([i['score'] for i in results])

上面的代码在 Jupyter notebook 中运行良好,它为我提供了预期的结果

[0.7495927810668945,0.2365245819091797]

所以现在如果我使用烧瓶包装器创建一个 docker 映像,它会卡在results = classifier([input_data]) 行并且执行将永远运行。

我的文件夹结构如下:

- src
    |-- app
         |--main.py
    |-- Dockerfile
    |-- requirements.txt

我使用下面的Dockerfile 创建图像

FROM tiangolo/uwsgi-nginx-flask:python3.8
COPY ./requirements.txt /requirements.txt
COPY ./app /app
WORKDIR /app
RUN pip install -r /requirements.txt
RUN echo "uwsgi_read_timeout 1200s;" > /etc/nginx/conf.d/custom_timeout.conf

而我的requirements.txt文件如下:

pandas==1.1.5
transformers==4.4.2
torch==1.6.0

我的main.py 脚本如下所示:

from flask import Flask, json, request, jsonify
import traceback
import pandas as pd
from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline


app = Flask(__name__)
app.config["JSON_SORT_KEYS"] = False

model_name = 'nlptown/bert-base-multilingual-uncased-sentiment'
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
nlp = pipeline('sentiment-analysis', model=model_path, tokenizer=model_path)

@app.route("/")
def hello():
    return "Model: Sentiment pipeline test"


@app.route("/predict", methods=['POST'])
def predict():

    json_request = request.get_json(silent=True)
    input_list = [i['text'] for i in json_request["input_data"]]
    
    results = nlp(input_list)         ##########  Getting stuck here
    for result in results:
        print(f"label: {result['label']}, with score: {round(result['score'], 4)}")
    score_list = [round(i['score'], 4) for i in results]
    
    return jsonify(score_list)

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=False, port=80)

我的输入有效载荷的形式是

{"input_data" : [{"text" : "We are very happy to show you the Transformers library."},
                 {"text" : "We hope you don't hate it."}]}

我尝试查看变压器 github 问题,但找不到。即使在使用烧瓶开发服务器时,我的执行工作也很好,但是当我包装它并创建一个 docker 映像时它会永远运行。我不确定在创建 docker 映像时是否缺少要包含的任何其他依赖项。

谢谢。

【问题讨论】:

    标签: python docker pytorch huggingface-transformers


    【解决方案1】:

    我遇到了类似的问题。似乎启动应用程序以某种方式污染了变形金刚模型的内存。可能与 Flask 如何进行线程有关,但不知道为什么。为我解决的问题是在不同的线程中做导致麻烦的事情(加载模型)。

    import threading
    
    
    def preload_models():
        "LOAD MODELS"
        return 0
    
    def start_app():
    
        app = create_app()
        register_handlers(app)
    
        preloading = threading.Thread(target=preload_models)
        preloading.start()
        preloading.join()
    
        return app
    

    先在这里回复。如果这有帮助,我会非常高兴。

    【讨论】:

    • 我认为 pytorch 模型在我们使用不同的 uwsgi worker 加载模型时会遇到问题,所以我觉得我们需要在单个 worker 中加载模型。
    【解决方案2】:

    Flask 使用端口 5000。在创建 docker 映像时,确保以这种方式设置端口非常重要。将最后一行替换为以下内容:

    app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
    

    请务必在顶部import os

    最后,在Dockerfile 中添加

    EXPOSE 5000
    CMD ["python", "./main.py"]
    

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多