EDIT2:下面的Github链接包含从进程调用TF模型的问题的可能解决方案.它们包括急切执行和专用服务器进程,通过http请求提供TF模型预测.我想知道是否使用自定义服务器和请求我赢得任何时间相比每次初始化全局变量和调用tf.train.Server
,但它似乎更优雅的方式.
我将调查内存泄漏,如果它消失了,请关闭此问题.
编辑:添加简单的可重现的问题示例:
https://github.com/hcl14/Tensorflow-server-launched-from-child-process
背景:我正在运行Tensorflow服务器,并从"分叉"进程连接到它.动态创建(和销毁)进程对我来说至关重要 - 我在那里移动了高负载的代码部分,因为奇怪的内存泄漏,Python剖析器看不到(线程无法解决问题).因此,我希望快速初始化流程并立即开始工作.仅当进程被销毁时才释放内存.
做实验,我发现了一个解决方案,当加载的模型和图形被保存到全局变量中,然后由子进程(默认使用'fork'模式)进行,然后调用服务器.
问题:对我来说奇怪的是,在加载keras模型之后,我无法锁定我不希望修改的图形,并且tf.global_variables_initializer()
每次在子进程中打开新会话时我都需要运行.但是,在没有任何会话创建的主流程中运行虚拟运行Ok.我知道在这种情况下,tensorflow使用默认会话,但是图形上的所有变量都应该在模型运行后初始化,所以我希望新会话能够使用先前定义的图形工作.
因此,我认为修改模型会使Python对子进程('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
Run Code Online (Sandbox Code Playgroud)
在主要过程中:
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 …
Run Code Online (Sandbox Code Playgroud) 我已阅读有关解决方案const A a[3] = { {0,0}, {1,1}, {2,2} },
但在我的程序const
中无法使用:
class Paper: public PaperQueue{
...
protected:
typedef int (Utils::*funcPtr) (int, int); //I use external function there
funcPtr p;
Utils* fptr;
public:
int pricefunc(){
addprice = (fptr->*p) (t,price);
}
Paper(int n, unsigned int pr):PaperQueue(n){
...
p=&Utils::commonpricefunc;
}
void Put(int a){
...
}
...
}
class Bank{
...
void Buy(Paper &p){
(/*this function modifies many parameters in 'p'*/)
...
}
...
}
int main(){
Bank B;
int pn=5;
/* …
Run Code Online (Sandbox Code Playgroud) 假设我有一个向量
test<-c("a","b","c","d","e")
我正在使用另一个索引向量更改顺序(这是必不可少的):
sortvect<-c(2,3,5,4,1)
test2<-test[sortvect]
Run Code Online (Sandbox Code Playgroud)
之后我做了一些操作test2
,之后我想切换回初始订单,有sortvect
:
test<-give_my_order_back(test2,sortvect)
我尝试过test2[sortvect]
,test2[rev(sortvect)]
但解决方案明显不同.
假设我有一个模块:
mymodule/example.py
:
def add_one(number):
return number + 1
Run Code Online (Sandbox Code Playgroud)
和mymodule/__init__.py
:
from .example import *
foo = "FOO"
def bar():
return 1
Run Code Online (Sandbox Code Playgroud)
现在我在 的根部看到该函数mymodule
:
>>> import mymodule
>>> mymodule.add_one(3)
4
>>> mymodule.foo
'FOO'
Run Code Online (Sandbox Code Playgroud)
另外,我看到add_one
通过dir
以下方式导入example
:
>>> dir(mymodule)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'add_one', 'bar', 'example', 'foo']
Run Code Online (Sandbox Code Playgroud)
但是当我输入时,help(mymodule)
我只看到example
,foo
和bar
,但看不到导入的add_one
:
Help on package mymodule:
NAME
mymodule
PACKAGE CONTENTS
example
FUNCTIONS
bar() …
Run Code Online (Sandbox Code Playgroud) 我想检查批次中的偶数和奇数元素,并在需要时交换它们。我设法得到两个我想交织的张量:
def tf_oplu(x, name=None):
even = x[:,::2] #slicing into odd and even parts on the batch
odd = x[:,1::2]
even_flatten = tf.reshape(even, [-1]) # flatten tensors
#in row-major order to apply function across them
odd_flatten = tf.reshape(odd, [-1])
compare = tf.to_float(even_flatten<odd_flatten)
compare_not = tf.to_float(even_flatten>=odd_flatten)
#def oplu(x,y): # trivial function
# if x<y : # (x<y)==1
# return y, x
# else:
# return x, y # (x<y)==0
even_flatten_new = odd_flatten * compare + even_flatten * compare_not
odd_flatten_new = odd_flatten * …
Run Code Online (Sandbox Code Playgroud) 我正在使用 GANEstimator 和 MirroredStrategy 来处理单个实例的多个 GPU。input_fn
在我的情况下tf.data.Dataset
有以下设置:
dataset = dataset.repeat()
dataset = dataset.shuffle(buffer_size=100)
dataset = dataset.batch(self.batch_size, drop_remainder=True)
dataset = dataset.prefetch(100)
Run Code Online (Sandbox Code Playgroud)
我问这个的原因是我是否需要dataset.shard()
手动指定一些东西才能将不同的数据传递给工人?我正在挖掘Estimator和MirroredStrategy的代码,但我不清楚发生了什么。从分布式策略的描述中产生了额外的混淆:
MirroredStrategy: This does in-graph replication with synchronous
training on many GPUs on one machine. Essentially, we create copies of all
variables in the model's layers on each device. We then use all-reduce
to combine gradients across the devices before applying them
to the variables to keep …
Run Code Online (Sandbox Code Playgroud) 我有一个大小为 3x3x3 的体素(np.array),填充了一些值,这个设置对我来说是必不可少的。我想要它的旋转不变表示。对于这种情况,我决定尝试 PCA 表示,它被认为对正交变换是不变的。其他
为简单起见,我进行了一些轴交换,但万一我弄错了,可以有np.rot90
.
我已经将我的 3d 体素解释为一组加权的 3d 立方体点向量,我错误地将其称为“基础”,总共 27 个(所以这是空间中的一些 3d 点,由向量表示,从立方体点获得,由体素缩放值)。
import numpy as np
voxel1 = np.random.normal(size=(3,3,3))
voxel2 = np.transpose(voxel1, (1,0,2)) #np.rot90(voxel1) #
basis = []
for i in range(3):
for j in range(3):
for k in range(3):
basis.append([i+1, j+1, k+1]) # avoid 0
basis = np.array(basis)
voxel1 = voxel1.reshape((27,1))
voxel2 = voxel2.reshape((27,1))
voxel1 = voxel1*basis # weighted basis vectors
voxel2 = voxel2*basis
Run Code Online (Sandbox Code Playgroud)
print(voxel1.shape)
(27, 3)
Run Code Online (Sandbox Code Playgroud)
然后我对那 27 …
python ×4
tensorflow ×3
arrays ×1
c++ ×1
class ×1
constructor ×1
math ×1
numpy ×1
parameters ×1
pca ×1
r ×1
sorting ×1
voxel ×1