在 Google 云 运行 上提供 GPT2 服务的 Flask 应用程序不保留下载的文件?
Flask app serving GPT2 on Google Cloud Run not persisting downloaded files?
我在 Google Cloud 运行 上有一个 Flask 应用程序 运行,它需要下载一个大型模型(来自 huggingface 的 GPT-2)。这需要一段时间才能下载,所以我正在尝试进行设置,以便它只在部署时下载,然后只为后续访问提供服务。那就是我在我的主烧瓶应用程序 app.py:
导入的脚本中有以下代码
import torch
# from transformers import GPT2Tokenizer, GPT2LMHeadModel
from transformers import AutoTokenizer, AutoModelWithLMHead
# Disable gradient calculation - Useful for inference
torch.set_grad_enabled(False)
# Check if gpu or cpu
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Load tokenizer and model
try:
tokenizer = AutoTokenizer.from_pretrained("./gpt2-xl")
model = AutoModelWithLMHead.from_pretrained("./gpt2-xl")
except Exception as e:
print('no model found! Downloading....')
AutoTokenizer.from_pretrained('gpt2').save_pretrained('./gpt2-xl')
AutoModelWithLMHead.from_pretrained('gpt2').save_pretrained('./gpt2-xl')
tokenizer = AutoTokenizer.from_pretrained("./gpt2-xl")
model = AutoModelWithLMHead.from_pretrained("./gpt2-xl")
model = model.to(device)
这基本上是尝试加载下载的模型,如果失败,它会下载模型的新副本。我将自动缩放设置为最小值 1,我认为这意味着某些内容将始终为 运行,因此即使在 activity 之后下载的文件也会保留。但是当某些人尝试使用它时,它总是不得不重新下载冻结应用程序的模型。我正在尝试重新创建类似此应用程序 https://text-generator-gpt2-app-6q7gvhilqq-lz.a.run.app/ 的东西,它似乎没有相同的加载时间问题。在烧瓶应用程序本身中,我有以下内容:
@app.route('/')
@cross_origin()
def index():
prompt = wp[random.randint(0, len(wp)-1)]
res = generate(prompt, size=75)
generated = res.split(prompt)[-1] + '\n \n...TO BE CONTINUED'
#generated = prompt
return flask.render_template('main.html', prompt = prompt, output = generated)
if __name__ == "__main__":
app.run(host='0.0.0.0',
debug=True,
port=PORT)
但它似乎每隔几个小时就会重新下载一次模型...我怎样才能避免应用程序重新下载模型并让那些想尝试它的人冻结应用程序?
当容器实例停止时,写入文件系统的数据不会保留。
Cloud 运行 生命周期是 HTTP 请求和 HTTP 响应之间的时间。重叠请求会延长此生命周期。一旦发送了最终的 HTTP 响应,您的容器就可以停止。
云 运行 个实例可以 运行 在不同的硬件(集群)上。一个实例将不会具有与另一个实例相同的临时数据。实例可以移动。下载大文件并将其保存到内存文件系统的策略不会始终如一地起作用。
另请注意,文件系统是内存中的,这意味着您需要有额外的内存来存储文件。
我在 Google Cloud 运行 上有一个 Flask 应用程序 运行,它需要下载一个大型模型(来自 huggingface 的 GPT-2)。这需要一段时间才能下载,所以我正在尝试进行设置,以便它只在部署时下载,然后只为后续访问提供服务。那就是我在我的主烧瓶应用程序 app.py:
导入的脚本中有以下代码import torch
# from transformers import GPT2Tokenizer, GPT2LMHeadModel
from transformers import AutoTokenizer, AutoModelWithLMHead
# Disable gradient calculation - Useful for inference
torch.set_grad_enabled(False)
# Check if gpu or cpu
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Load tokenizer and model
try:
tokenizer = AutoTokenizer.from_pretrained("./gpt2-xl")
model = AutoModelWithLMHead.from_pretrained("./gpt2-xl")
except Exception as e:
print('no model found! Downloading....')
AutoTokenizer.from_pretrained('gpt2').save_pretrained('./gpt2-xl')
AutoModelWithLMHead.from_pretrained('gpt2').save_pretrained('./gpt2-xl')
tokenizer = AutoTokenizer.from_pretrained("./gpt2-xl")
model = AutoModelWithLMHead.from_pretrained("./gpt2-xl")
model = model.to(device)
这基本上是尝试加载下载的模型,如果失败,它会下载模型的新副本。我将自动缩放设置为最小值 1,我认为这意味着某些内容将始终为 运行,因此即使在 activity 之后下载的文件也会保留。但是当某些人尝试使用它时,它总是不得不重新下载冻结应用程序的模型。我正在尝试重新创建类似此应用程序 https://text-generator-gpt2-app-6q7gvhilqq-lz.a.run.app/ 的东西,它似乎没有相同的加载时间问题。在烧瓶应用程序本身中,我有以下内容:
@app.route('/')
@cross_origin()
def index():
prompt = wp[random.randint(0, len(wp)-1)]
res = generate(prompt, size=75)
generated = res.split(prompt)[-1] + '\n \n...TO BE CONTINUED'
#generated = prompt
return flask.render_template('main.html', prompt = prompt, output = generated)
if __name__ == "__main__":
app.run(host='0.0.0.0',
debug=True,
port=PORT)
但它似乎每隔几个小时就会重新下载一次模型...我怎样才能避免应用程序重新下载模型并让那些想尝试它的人冻结应用程序?
当容器实例停止时,写入文件系统的数据不会保留。
Cloud 运行 生命周期是 HTTP 请求和 HTTP 响应之间的时间。重叠请求会延长此生命周期。一旦发送了最终的 HTTP 响应,您的容器就可以停止。
云 运行 个实例可以 运行 在不同的硬件(集群)上。一个实例将不会具有与另一个实例相同的临时数据。实例可以移动。下载大文件并将其保存到内存文件系统的策略不会始终如一地起作用。
另请注意,文件系统是内存中的,这意味着您需要有额外的内存来存储文件。