Matplotlib AWS EC2导致Streamlight ML应用程序出现问题

Matplotlib AWS EC2导致Streamlight ML应用程序出现问题,matplotlib,amazon-ec2,pytorch,streamlit,Matplotlib,Amazon Ec2,Pytorch,Streamlit,这很奇怪,因为在我的本地机器上,这个问题没有发生,而且我的应用程序工作正常 但是,当我在AWS EC2实例上运行应用程序时,它会给出一个有关matplotlib导入的错误。在matplotlib导入下面,我有matplotlib.use('TkAgg')。当代码是这样时,Streamlight应用程序会给我这个错误(仅在EC2实例上): importorror:无法加载需要“tk”交互框架的后端“TkAgg”,因为“headless”当前正在运行 Traceback: File "/h

这很奇怪,因为在我的本地机器上,这个问题没有发生,而且我的应用程序工作正常

但是,当我在AWS EC2实例上运行应用程序时,它会给出一个有关matplotlib导入的错误。在matplotlib导入下面,我有
matplotlib.use('TkAgg')
。当代码是这样时,Streamlight应用程序会给我这个错误(仅在EC2实例上):

importorror:无法加载需要“tk”交互框架的后端“TkAgg”,因为“headless”当前正在运行

Traceback:
File "/home/ubuntu/anaconda3/envs/streamlit/lib/python3.6/site-packages/streamlit/script_runner.py", line 332, in _run_script
    exec(code, module.__dict__)
File "/home/ubuntu/extremely_unnecessary/app.py", line 16, in <module>
    matplotlib.use('TkAgg')
File "/home/ubuntu/anaconda3/envs/streamlit/lib/python3.6/site-packages/matplotlib/__init__.py", line 1171, in use
    plt.switch_backend(name)
File "/home/ubuntu/anaconda3/envs/streamlit/lib/python3.6/site-packages/matplotlib/pyplot.py", line 287, in switch_backend
    newbackend, required_framework, current_framework))
应用程序的代码:

import matplotlib.pyplot as plt
from PIL import Image
from torchvision.utils import save_image
import tqdm
import streamlit as st
from models import TransformerNet
from utils import *
import torch
import numpy as np
from torch.autograd import Variable
import argparse
import tkinter as tk
import os
import cv2
import matplotlib
matplotlib.use('agg')


def main():

    uploaded_file = st.file_uploader(
        "Choose an image", type=['jpg', 'png', 'webm', 'mp4', 'gif', 'jpeg'])
    if uploaded_file is not None:
        st.image(uploaded_file, width=200)

    folder = os.path.abspath(os.getcwd())
    folder = folder + '/models'

    fnames = []

    for basename in os.listdir(folder):
        print(basename)
        fname = os.path.join(folder, basename)

        if fname.endswith('.pth'):
            fnames.append(fname)

    checkpoint = st.selectbox('Select a pretrained model', fnames)

    os.makedirs("images/outputs", exist_ok=True)

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    # device = torch.device("cpu")
    transform = style_transform()

    # Define model and load model checkpoint
    transformer = TransformerNet().to(device)
    transformer.load_state_dict(torch.load(checkpoint))
    transformer.eval()

    # Prepare input
    image_tensor = Variable(transform(Image.open(
        uploaded_file).convert('RGB'))).to(device)
    image_tensor = image_tensor.unsqueeze(0)

    # Stylize image
    with torch.no_grad():
        stylized_image = denormalize(transformer(image_tensor)).cpu()

    fn = str(np.random.randint(0, 100)) + 'image.jpg'
    save_image(stylized_image, f"images/outputs/stylized-{fn}")

    st.image(f"images/outputs/stylized-{fn}")


if __name__ == "__main__":
    main()



事实证明,我所需要做的就是实现错误消息中的那一行-在第53行中,我只需要从以下内容更改它:

transformer.load_state_dict(torch.load(checkpoint))
对此

transformer.load_state_dict(torch.load(
    checkpoint, map_location=torch.load('cpu')))

而且它有效

尝试构建一个容器并在本地服务器上运行它。这将向您展示从依赖项和版本角度看可能缺少的内容。是否像在docker容器中一样构建容器?我对docker还很陌生——不管怎样,我开始收到一条新的错误消息,我想这会解释它,这会增加原来的问题
transformer.load_state_dict(torch.load(
    checkpoint, map_location=torch.load('cpu')))