- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
EDIT2:下面的 Github 链接包含从进程调用 TF 模型的问题的可能解决方案。它们包括即时执行和专用服务器进程,通过 http 请求为 TF 模型预测提供服务。我想知道与每次初始化全局变量并调用 tf.train.Server
相比,使用自定义服务器和请求我是否可以随时获胜,但它似乎是更优雅的方式。
我将调查内存泄漏,如果它消失了,请关闭此问题。
编辑:添加了问题的简单可重现示例:
https://github.com/hcl14/Tensorflow-server-launched-from-child-process
背景:我正在运行 Tensorflow 服务器,并从“ fork ”进程连接到它。动态创建(和销毁)进程对我来说很重要——我把高负载的部分代码移到了那里,因为 weird memory leak ,对 Python 分析器不可见(线程不能解决问题)。因此,我希望进程能够快速初始化并立即开始工作。只有当进程被销毁时,内存才会被释放。
在做实验时,我找到了一个解决方案,将加载的模型和图形保存到全局变量中,然后由子进程(默认使用 'fork' 模式)获取,然后调用服务器。
问题:对我来说奇怪的是,加载keras模型后,我无法锁定我不希望修改的图形,我需要运行tf.global_variables_initializer()
每次我在子进程中打开新 session 。但是,在没有任何 session 创建的情况下在主流中运行虚拟运行正常。我知道在这种情况下,tensorflow 使用默认 session ,但图形上的所有变量都应在模型运行后初始化,因此我希望新 session 能够与先前定义的图形正常工作。
因此,我认为修改模型会使 Python 对子进程进行大量 pickle('fork' 模式),这会产生计算和内存开销。
请原谅我写了很多代码。我使用的模型对我来说是旧版和黑盒,所以我的问题可能与它有关。 Tensorflow版本是1.2(无法升级,模型不兼容),Python 3.6.5。
另外,也许我的解决方案效率低下,还有更好的解决方案,我将不胜感激您的建议。
我的设置如下:
1.Tensorflow服务器在主进程中启动:
初始化服务器:
def start_tf_server():
import tensorflow as tf
cluster = tf.train.ClusterSpec({"local": [tf_server_address]})
server = tf.train.Server(cluster, job_name="local", task_index=0)
server.join() # block process from exiting
在主进程中:
p = multiprocessing.Process(target=start_tf_server)
p.daemon=True
p.start() # this process never ends, unless tf server crashes
# WARNING! Graph initialization must be made only after Tf server start!
# Otherwise everything will hang
# I suppose this is because of another session will be
# created before the server one
# init model graph before branching processes
# share graph in the current process scope
interests = init_interests_for_process()
global_vars.multiprocess_globals["interests"] = interests
2.init_interests_for_process()
是一个模型初始化器,它加载我的遗留模型并在全局变量中共享它。我做了一个虚拟模型传递以在图表上初始化所有内容,然后想要锁定图表。但它不起作用:
def init_interests_for_process():
# Prevent errors on my GPU and disable tensorflow
# complaining about CPU instructions
import os
os.environ["CUDA_VISIBLE_DEVICES"]= ""
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow.contrib.keras import models
# create tensorflow graph
graph = tf.get_default_graph()
with graph.as_default():
TOKENIZER = joblib.load(TOKENIZER_FILE)
NN1_MODEL = models.load_model(NN1_MODEL_FILE)
with open(NN1_CATEGORY_NAMES_FILE, 'r') as f:
NN1_CATEGORY_NAMES = f.read().splitlines()
NN2_MODEL = models.load_model(NN2_MODEL_FILE)
with open(NN2_CATEGORY_NAMES_FILE, 'r') as f:
NN2_CATEGORY_NAMES = f.read().splitlines()
# global variable with all the data to be shared
interests = {}
interests["TOKENIZER"] = TOKENIZER
interests["NN1_MODEL"] = NN1_MODEL
interests["NN1_CATEGORY_NAMES"] = NN1_CATEGORY_NAMES
interests["NN2_MODEL"] = NN2_MODEL
interests["NN2_CATEGORY_NAMES"] = NN2_CATEGORY_NAMES
interests['all_category_names'] = NN1_CATEGORY_NAMES + \
NN2_CATEGORY_NAMES
# Reconstruct a Python object from a file persisted with joblib.dump.
interests["INTEREST_SETTINGS"] = joblib.load(INTEREST_SETTINGS_FILE)
# dummy run to create graph
x = tf.contrib.keras.preprocessing.sequence.pad_sequences(
TOKENIZER.texts_to_sequences("Dummy srting"),
maxlen=interests["INTEREST_SETTINGS"]["INPUT_LENGTH"]
)
y1 = NN1_MODEL.predict(x)
y2 = NN2_MODEL.predict(x)
# PROBLEM: I want, but cannot lock graph, as child process
# wants to run its own tf.global_variables_initializer()
# graph.finalize()
interests["GRAPH"] = graph
return interests
3.现在我生成进程(实际上,进程是从另一个进程生成的 - 层次结构很复杂):
def foo(q):
result = call_function_which_uses_interests_model(some_data)
q.put(result)
return # I've read it is essential for destroying local variables
q = Queue()
p = Process(target=foo,args=(q,))
p.start()
p.join()
result = q.get() # retrieve data
4.在这个过程中我调用模型:
# retrieve model from global variable
interests = global_vars.multiprocess_globals["interests"]
tokenizer = interests["TOKENIZER"]
nn1_model = interests["NN1_MODEL"]
nn1_category_names = interests["NN1_CATEGORY_NAMES"]
nn2_model = interests["NN2_MODEL"]
nn2_category_names = interests["NN2_CATEGORY_NAMES"]
input_length = interests["INTEREST_SETTINGS"]["INPUT_LENGTH"]
# retrieve graph
graph = interests["GRAPH"]
# open session for server
logger.debug('Trying tf server at ' + 'grpc://'+tf_server_address)
sess = tf.Session('grpc://'+tf_server_address, graph=graph)
# PROBLEM: and I need to run variables initializer:
sess.run(tf.global_variables_initializer())
tf.contrib.keras.backend.set_session(sess)
# finally, make a call to server:
with sess.as_default():
x = tf.contrib.keras.preprocessing.sequence.pad_sequences(
tokenizer.texts_to_sequences(input_str),
maxlen=input_length)
y1 = nn1_model.predict(x)
y2 = nn2_model.predict(x)
如果每次生成新进程时我不锁定图形并运行变量初始化程序,一切正常。 (除了,每次调用有大约 30-90 MB 的内存泄漏,python 内存分析器不可见)。当我想锁定图表时,我收到有关未初始化变量的错误:
FailedPreconditionError (see above for traceback):
Attempting to use uninitialized value gru_1/bias
[[Node: gru_1/bias/read = Identity[T=DT_FLOAT, _class=["loc:@gru_1/bias"],
_device="/job:local/replica:0/task:0/cpu:0"](gru_1/bias)]]
提前致谢!
最佳答案
您是否考虑过 TensorFlow Serving? https://www.tensorflow.org/serving/
通常您希望缓存 session ,我相信这是 TF 服务使用的策略。这将是迄今为止将 TF 模型部署到数据中心的最佳体验。
你也可以往另一个方向走tf.enable_eager_execution()
,这消除了对 session 的需要。变量仍然会被初始化,尽管它会在 Python 变量对象创建后立即发生。
但如果您真的想创建和销毁 session ,您可以用常量 ("freeze" it) 替换图中的变量。在这种情况下,我还会考虑禁用图优化,因为使用一组新的提要和提取的第一个 session.run
调用默认会花一些时间优化图(通过 配置
。GraphOptions
原型(prototype)中的 RewriterConfig
(从对问题的评论中扩展)
关于python - tensorflow 服务器 : I don't want to initialize global variables for every session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52700621/
正如主题所说.. 我如何告诉 GCC 允许我使用 SSE4.1 内在函数但不使用 SSE4.1 进行优化(例如,通过将 SSE4.1 字符串比较)贯穿所有其余代码翻译单元? 最佳答案 您可以使用 Fu
为了简单起见,假设我有表 users 和 interests 用户 id | name --------- 1 | amy 2 | brian 3 | carole 兴趣 uid | inter
我进行了一系列测试来开发一个简单的游戏,并且我已经达到了 Mockito 的 InOrder.verify() 产生错误的程度。 Verification in order failure. Want
哪种方法更好以及为什么。 最佳答案 不要使用是/否问题,而是使用带有自定义按钮的问题: The file blah.txt has been modified. Would you like to s
您好,我想使用以下命令放置多行描述 p4 --field Description="MY CLN Header \\n my CLN complete description in two -thre
我正在使用 jQuery Fancybox 弹出注册表单 here 我希望表单的大小为 450px x 700px,但无论我设置什么高度和宽度,我都会得到滚动条: $(document).r
大家好我在徘徊是否有一种简单的方法可以在没有 android 布局的情况下执行以下操作将图像放在中央顶部放置一个按钮中心中心在左下角放置一个按钮在右下角放置一个按钮 听起来没那么难吧? 好吧,我想不出
我正在尝试为我的 SOAP 请求添加安全性。我想在两个级别允许它:1. 基本 ssl。 2. 带证书的SSL。 我尝试在tomcat中设置Server.xml来使用clientAuth="want",
我有一个在页面中间有一个表格 View 的布局。我希望根据用户设备的屏幕尺寸任意调整表格 View 的大小。在 ascii 中: +-----------+ |some stuff | +------
我面临以下问题,我试图呈现一个 modalViewController 并使其覆盖整个屏幕,例如: [controller setWantsFullScreenLayout:yes]; [myNavC
我正在使用 MMDraweController。它完美地工作。我对 rootViewController 有疑问。当应用程序启动时,它会加载 loginViewController。所以我不想要侧边栏
我搜索了互联网和 SO,但无法找到解决此问题的方法。我正在使用混帐。我有代码,它在计算机 C1 上有一个分支 B1。在另一台计算机 C2 上,我克隆了这个分支并在本地创建了另一个分支 B2。 B2 未
我正在使用以下 CSS 将我的彩色图像转换为灰度图像。 img.desaturate{ filter: grayscale(100%); -webkit-filter: graysca
从 Windows 11 升级后,Select-String cmdlet 停止工作,每次我使用它时,它都会尝试“打开未知文件”,如下图所示: 我在尝试从批处理文件运行我的一个 ps 脚本时发现了它
只是想知道我的浏览器一直询问我是否想在每次点击浏览器链接刷新时停止调试非常烦人,因为这会减慢开发时间。 有没有其他人遇到过这个? 干杯 最佳答案 更新的答案,现在找到根本原因 经过两年看到这个错误时断
在使用 Linux 时,当我们尝试使用命令行安装某些东西时,我们会收到一个提示 "Do you want to continue"[Y/N].. 我想使用 ansible-playbook 自动化它。
我们使用 cruise control .net在我们的 Delphi 2006 应用程序中进行持续集成。我们使用类似于描述的设置 here . 问题: 1) 用于实现构建脚本的最佳脚本工具/语言是什
昨天,Photo 的应用程序在我的 iPhone 上崩溃了。我想知道发生了什么以及导致崩溃的原因。我打开应用程序,它立即崩溃(黑屏然后回到跳板)。 在我打开应用程序之前,iPhone 没有“激活”(
我正在尝试编写一个小守护程序,检查是否有邮件要发送,如果需要则执行工作,然后休眠 X 秒。 我对NodeJS的异步方式不太熟悉。所以我迷路了。 var sleep = require('sleep')
我的文本框中有一个字符串,并且只希望其中一个单词以粗体显示。有没有办法在代码中做到这一点而不附加文本?有点像在 xml/html 中如何完成...下划线也可以吗? 最好不要使用 xml 或 html
我是一名优秀的程序员,十分优秀!