title: How about Go in TensorFlow?
date: 2018-04-09 22:09:09
category: 默认分类
本文介绍 How about Go in TensorFlow?<!– more –>
How about Go in TensorFlow?
This article was original written by Jin Tian, welcome re-post, first come with
https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat:
jintianiloveu
我想写这个很久了,我们想看看采用go写TensorFlow是一种怎么样的体验?要知道go语言可是世界上最好的语言(拍黄片开始吐槽了..)。如果我们此举能够成功,用go语言编译自己的tensorfow程序,那岂不是编程一个executable file,直接丢给别人就能运行了?好,那我们开始吧。
安装TensorFlow Go
首先,这个不支持windows,且go的api不受tensorflow官方支持。但是go还是有很多优点吸引着我们来尝试一下的,如果可以编译成二进制的独立文件,那基本上可以抛弃C++了。
首先第一步需要安装一下tensorflow的C语言链接库:
TF_TYPE="cpu" # Change to "gpu" for GPU support
TARGET_DIRECTORY='/usr/local'
curl -L \
"https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-${TF_TYPE}-$(go env GOOS)-x86_64-1.6.0.tar.gz" |
sudo tar -C $TARGET_DIRECTORY -xz
首先是下载,然后解压到target目录。这个libtensorflow.so只有18M。我们可以把这个放到一个sh文件里面去。这个时候你会在/usr/local/lib
里面有libtensorfow.so
以及在/usr/local/include
里面有相应的头文件。
然后我们go get一下tensorflow的go依赖包:
go get github.com/tensorflow/tensorflow/tensorflow/go
完了就可以使用go了!
Go TensorFlow Hello World!
简单易行的操作之后,我们决定使用Go来写一个hello world,并且我们会看一下go编译之后的二进制文件的大小,是否可以独立分发。
我们已经迫不系带要用go写一个hello world 了,但是好像上面的go get操作有点慢,这是因为你懂得原因,git速度很慢,稍等一下,与此同时我们出去喝杯茶。
。。。。
他妈的一小时过了还没有go get完???
我还能说什么,我该如何表达。QNMD,速度咋这么慢。再等等,在等等,稍安勿躁,保持冷静。
。。。。
午饭都吃完了,才go get完。好吧,让我们开始吧。
首先,我们需要新建一个`hello_tf.go
的文件,然后测试一下我们的hello world的代码:
package main
import (
"fmt"
tf "github.com/tensorflow/tensorflow/tensorflow/go"
"github.com/tensorflow/tensorflow/tensorflow/go/op"
)
func main() {
// Construct a graph with an operation that produces a string constant. s := op.NewScope()
c := op.Const(s, "Hello from TensorFlow version "+tf.Version())
graph, err := s.Finalize()
if err != nil {
panic(err)
}
// Execute the graph in a session. sess, err := tf.NewSession(graph, nil)
if err != nil {
panic(err)
}
output, err := sess.Run(nil, []tf.Output{c}, nil)
if err != nil {
panic(err)
}
fmt.Println(output[0].Value())
}
看上去还不错,golang的写法与tensorflow贸易太大的差别。
让我们编译一下:
go build -o hello_go hello_tf.go
看上去还是十分6的啊,而且最终编译的文件大小是3M..emmmmm…如果我把这个给别人,对方没有任何tensorflow环境, 能执行吗?
经过我的测试,貌似并不能运行,会出现类似于:
Reason: image not found
Abort trap: 6
的错误,究其原因是因为对方机器上没有安装tensorflow.so的动态链接库。
不过我们最终还是踩了这坑,并不能说完全没有用,最起码,对于深度学习的部署,尤其是0依赖的部署,还是有一些探究了。