现在我们使用TensorFlow来训练和导出模型.我们可以像这样使用这个模型来实现推理服务tensorflow/serving.
我有一个关于tf.Session对象是否是线程安全的问题.如果是,我们可以在启动后初始化对象并使用单例对象来处理并发请求.
我已经基于"广泛而深入"的例子创建了一个模型(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/learn/wide_n_deep_tutorial.py).
我已经将模型导出如下:
m = build_estimator(model_dir)
m.fit(input_fn=lambda: input_fn(df_train, True), steps=FLAGS.train_steps)
results = m.evaluate(input_fn=lambda: input_fn(df_test, True), steps=1)
print('Model statistics:')
for key in sorted(results):
print("%s: %s" % (key, results[key]))
print('Done training!!!')
# Export model
export_path = sys.argv[-1]
print('Exporting trained model to %s' % export_path)
m.export(
export_path,
input_fn=serving_input_fn,
use_deprecated_input_fn=False,
input_feature_key=INPUT_FEATURE_KEY
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何创建一个客户端来从这个导出的模型进行预测?还有,我是否正确导出了模型?
最终我也需要能够在Java中做到这一点.我怀疑我可以通过使用gRPC从proto文件创建Java类来实现这一点.
文档非常粗略,因此我在这里问.
非常感谢!
我有demo.sh工作正常,我看了解parser_eval.py并在一定程度上完成了所有操作.但是,我没有看到如何使用TensorFlow服务来提供这个模型.我可以看到两个问题:
1)这些图没有导出的模型,图形是在每次调用时使用图形构建器(例如structured_graph_builder.py),上下文协议缓冲区以及其他一些我不完全理解的东西构建的. (它似乎也注册了额外的syntaxnet.ops).那么......是否可能,以及如何将这些模型导出为Serving所需的"捆绑"形式SessionBundleFactory?如果没有,似乎需要在C++中重新实现图形构建逻辑/步骤,因为Serving仅在C++上下文中运行.
2)demo.sh实际上是两个模型与UNIX管道一起管道,所以任何Servable都必须(可能)构建两个会话并将数据从一个到另一个进行编组.这是正确的方法吗?或者是否可以构建一个"大"图表,其中包含两个"修补"并同时导出的模型?
我花了几个小时尝试设置Tensorflow-hub模块“通用语句编码器”的Tensorflow服务。这里有一个类似的问题:
如何使用TensorFlow服务使TensorFlow集线器嵌入成为可服务的?
我一直在Windows计算机上执行此操作。
这是我用来构建模型的代码:
import tensorflow as tf
import tensorflow_hub as hub
MODEL_NAME = 'test'
VERSION = 1
SERVE_PATH = './models/{}/{}'.format(MODEL_NAME, VERSION)
with tf.Graph().as_default():
module = hub.Module("https://tfhub.dev/google/universal-sentence-
encoder/1")
text = tf.placeholder(tf.string, [None])
embedding = module(text)
init_op = tf.group([tf.global_variables_initializer(),
tf.tables_initializer()])
with tf.Session() as session:
session.run(init_op)
tf.saved_model.simple_save(
session,
SERVE_PATH,
inputs = {"text": text},
outputs = {"embedding": embedding},
legacy_init_op = tf.tables_initializer()
)
Run Code Online (Sandbox Code Playgroud)
我已经到了运行以下行的地步:
saved_model_cli show --dir ${PWD}/models/test/1 --tag_set serve --signature_def serving_default
Run Code Online (Sandbox Code Playgroud)
给我以下结果:
The given SavedModel SignatureDef contains the following input(s):
inputs['text'] tensor_info:
dtype: …Run Code Online (Sandbox Code Playgroud) 我正在使用 TF 对象检测 API 来训练我最终将使用 tf-serving 部署的模型。我计划利用这个网络的输出(在中间 CNN 层)并为除对象检测之外的其他功能构建额外的网络。我计划在 TF 2.0 中开发新网络。但是,为了使这项工作顺利进行,(我怀疑)需要更新对象检测 API 以支持 TF-2.0。
是否有将 TF OD API 更新到 TF 2.0 的计划?
我尝试运行 model_builder_test 并且失败了,如下所示,因为 tensorflow 2.0 不再支持 contrib。
Traceback (most recent call last):
File "object_detection/builders/model_builder_test.py", line 23, in <module>
from object_detection.builders import model_builder
File "/models/research/object_detection/builders/model_builder.py", line 19, in <module>
from object_detection.builders import box_predictor_builder
File "/models/research/object_detection/builders/box_predictor_builder.py", line 18, in <module>
from object_detection.core import box_predictor
File "/research/object_detection/core/box_predictor.py", line 35, in <module>
slim = tf.contrib.slim
AttributeError: module 'tensorflow' has no attribute …Run Code Online (Sandbox Code Playgroud) 我有一个小型的Web服务器,可以根据句子获取输入,并需要使用Tensorflow服务返回模型预测.使用我们的单GPU可以很好地工作,但是现在我想启用批处理,以便Tensorflow服务等待一段时间对传入的句子进行分组,然后在GPU上一次处理它们.
我正在使用预先设计的服务器框架和预先设计的批处理框架,使用Tensorflow服务的初始版本.我正在使用--batching标志启用批处理并设置batch_timeout_micros = 10000和max_batch_size = 1000.日志记录确认已启用批处理并且正在使用GPU.
但是,当向服务服务器发送请求时,批处理具有最小的影响.同时发送50个请求几乎在时间使用方面与发送5个请求成线性比例.有趣的是,predict()服务器的功能对每个请求都运行一次(见这里),这表明批处理没有得到正确处理.
我错过了什么吗?如何检查批处理有什么问题?
请注意,这与如何在Tensorflow服务中进行批处理不同?因为该问题仅检查如何从单个客户端发送多个请求,而不是如何启用Tensorflow服务的多个单独请求的幕后批处理.
问题:
Tensorflow Saver,Exporter,SavedModelBuilder都可以用于保存模型.根据 /sf/ask/2921807101/和张量流服务,我知道Saver用于保存训练检查点和Exporter和SavedModelBuilder用于服务.
但是,我不知道他们的产出的差异.是变量.data - ??? - of - ??? 和SavedModelBuilder生成的variable.index文件与cpkt-xxx.index和cpkt-xxx.data相同 - ??? - of - ??? Saver生成的?
我仍然对tensorflow的模型文件的含义感到困惑.我读过http://cv-tricks.com/tensorflow-tutorial/save-restore-tensorflow-models-quick-complete-tutorial/和Tensorflow:如何保存/恢复模式?这让我感到更加困惑.
模型目录中有4个文件:
文件2和4存储变量的权重.文件3存储图表.然后1商店是什么?
如何将Saver的输出转换为SavedModelBuilder.我有检查点目录,并希望导出模型以进行服务.根据https://github.com/tensorflow/tensorflow/tree/master/tensorflow/python/saved_model
它应该是这样的
export_dir = ...
...
builder = tf.saved_model.builder.SavedModelBuilder(export_dir)
with tf.Session(graph=tf.Graph()) as sess:
...
builder.add_meta_graph_and_variables(sess,
[tf.saved_model.tag_constants.TRAINING],
signature_def_map=foo_signatures,
assets_collection=foo_assets)
...
with tf.Session(graph=tf.Graph()) as sess:
...
builder.add_meta_graph(["bar-tag", "baz-tag"])
...
builder.save()
Run Code Online (Sandbox Code Playgroud)
所以,我首先需要加载检查点:
saver = tf.train.import_meta_graph('model-number.meta')
saver.restore(sess, tf.train.latest_checkpoint('./'))
Run Code Online (Sandbox Code Playgroud)
然后将其sess用于构建器.
我对吗?
我发现Dataset.map()功能非常适合设置管道以预先处理图像/音频数据,然后再送入网络进行培训,但我遇到的一个问题是在预处理之前访问原始数据以发送到tensorboard作为摘要.
例如,假设我有一个加载音频数据的功能,做一些帧,制作频谱图,然后返回.
import tensorflow as tf
def load_audio_examples(label, path):
# loads audio, converts to spectorgram
pcm = ... # this is what I'd like to put into tf.summmary.audio() !
# creates one-hot encoded labels, etc
return labels, examples
# create dataset
training = tf.data.Dataset.from_tensor_slices((
tf.constant(labels),
tf.constant(paths)
))
training = training.map(load_audio_examples, num_parallel_calls=4)
# create ops for training
train_step = # ...
accuracy = # ...
# create iterator
iterator = training.repeat().make_one_shot_iterator()
next_element = iterator.get_next()
# ready session
sess = tf.InteractiveSession()
tf.global_variables_initializer().run() …Run Code Online (Sandbox Code Playgroud) python tensorflow tensorboard tensorflow-serving tensorflow-datasets
我正忙于配置 TensorFlow Serving 客户端,该客户端要求 TensorFlow Serving 服务器针对给定模型对给定输入图像进行预测。
如果请求的模型尚未提供,则会从远程 URL 下载到服务器模型所在的文件夹。(客户这样做)。此时我需要更新model_config并触发服务器重新加载它。
此功能似乎存在(基于https://github.com/tensorflow/serving/pull/885和https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22) ,但我找不到有关如何实际使用它的任何文档。
我本质上是在寻找一个 python 脚本,我可以用它从客户端触发重新加载(或者以其他方式配置服务器以侦听更改并触发重新加载本身)。
我正在尝试在一个 NVIDIA Tesla V100 GPU 上运行 Tensorflow 作为服务。作为服务器,我的程序需要同时接受多个请求。所以,我的问题如下:
当多个请求同时到达时,假设我们没有使用批处理,这些请求是在 GPU 上顺序运行还是并行运行?我了解独立进程具有单独的 CUDA 上下文,它们在 GPU 上按顺序运行。但这些请求实际上是同一进程中的不同线程,应该共享一个 CUDA 上下文。所以根据文档,GPU 可以同时运行多个内核。如果这是真的,是否意味着如果我有大量请求同时到达,GPU 利用率可以达到 100%?但这在我的实验中从未发生过。
在不同线程中运行一个会话与在不同线程中运行不同会话有什么区别?哪个是实现 Tensorflow 服务器的正确方法?Tensorflow Serving 使用哪一种?
任何建议将被认真考虑。谢谢!