How about Go in TensorFlow?

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 

《How about Go in TensorFlow?》
《How about Go in TensorFlow?》

看上去还是十分6的啊,而且最终编译的文件大小是3M..emmmmm…如果我把这个给别人,对方没有任何tensorflow环境, 能执行吗?

经过我的测试,貌似并不能运行,会出现类似于:

Reason: image not found
Abort trap: 6

的错误,究其原因是因为对方机器上没有安装tensorflow.so的动态链接库。

不过我们最终还是踩了这坑,并不能说完全没有用,最起码,对于深度学习的部署,尤其是0依赖的部署,还是有一些探究了。

    原文作者:金天
    原文地址: https://zhuanlan.zhihu.com/p/35493977
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞