1.bazelԴ?码安? ??װ
2.从源码build Tensorflow2.6.5的记录
3.TF-TRT使用环境搭建
4.实战!用Bazel来管理iOS程序
5.å¦ä½ä½¿ç¨bazel build
6.[推理部署]👉Mac源码编译TensorFlow C++指北
bazelԴ?码安? ??װ
本文将介绍如何从零开始学习并使用ONOS,包括安装、码安配置和测试。码安首先,码安你需要获取ONOS的码安c tts源码源代码并将其添加到.bashrc或.bash_profile中,使用预设的码安alias进行操作。然后使用构建工具(原为buck,码安现已更改为bazel)构建ONOS,码安并进行单元测试。码安
接下来,码安你可以在本地计算机上启动ONOS服务器,码安使用另一个终端开启ONOS控制台。码安成功后,码安会看到ONOS预设使用端口作为控制台。码安此时,恭喜你,已经成功在本地机上启动了ONOS。matlab查看程序源码
ONOS还提供了图形用户界面(UI)界面,预设使用端口。你可以通过/example
$ cat > src/main/java/com/example/ProjectRunner.java <<EOF
package com.example;
public class ProjectRunner {
public static void main(String args[]) {
Greeting.sayHi();
}
}
EOF
$ cat > src/main/java/com/example/Greeting.java <<EOF
package com.example;
public class Greeting {
public static void sayHi() {
System.out.println("Hi!");
}
}
EOF
Bazeléè¿å·¥ä½åºä¸ææå为 BUILD çæ件æ¥è§£æéè¦æ建ç项ç®ä¿¡æ¯ï¼å æ¤ï¼æ们éè¦å å¨ ~/gitroot/my-project ç®å½å建ä¸ä¸ª BUILD æ建æ件ãä¸é¢æ¯BUILDæ建æ件çå 容ï¼
# ~/gitroot/my-project/BUILD
java_binary(
name = "my-runner",
srcs = glob(["**/*.java"]),
main_class = "com.example.ProjectRunner",
)
BUILDæ件éç¨ç±»ä¼¼Pythonçè¯æ³ãè½ç¶ä¸è½å å«ä»»æçPythonè¯æ³ï¼ä½æ¯BUILDæ件ä¸çæ¯ä¸ªæ建è§åçèµ·æ¥é½è±¡æ¯ä¸ä¸ªPythonå½æ°è°ç¨ï¼èä¸ä½ ä¹å¯ä»¥ç¨ "#" å¼å¤´æ¥æ·»å åè¡æ³¨éã
java_binary æ¯ä¸ä¸ªæ建è§åãå ¶ä¸ name 对åºä¸ä¸ªæ建ç®æ çæ è¯ç¬¦ï¼å¯ç¨ç¨å®æ¥åBazelæå®æ建åªä¸ªé¡¹ç®ãsrcs 对åºä¸ä¸ªæºæ件å表ï¼Bazeléè¦å°è¿äºæºæ件ç¼è¯ä¸ºäºè¿å¶æ件ãå ¶ä¸ glob(["**/*.java"]) 表示éå½å å«æ¯ä¸ªåç®å½ä¸ä»¥æ¯ä¸ª .java 为åç¼åçæ件ãcom.example.ProjectRunner æå®å å«mainæ¹æ³çç±»ã
ç°å¨å¯ä»¥ç¨ä¸é¢çå½ä»¤æ建è¿ä¸ªJavaç¨åºäºï¼
$ cd ~/gitroot/my-project
$ bazel build //:my-runner
INFO: Found 1 target...
Target //:my-runner up-to-date:
bazel-bin/my-runner.jar
bazel-bin/my-runner
INFO: Elapsed time: 1.s, Critical Path: 0.s
$ bazel-bin/my-runner
Hi!
æåï¼ä½ å·²ç»æåæ建äºç¬¬ä¸ä¸ªBazel项ç®äºï¼
æ·»å ä¾èµå ³ç³»
对äºå°é¡¹ç®å建ä¸ä¸ªè§åæ¯å¯ä»¥çï¼ä½æ¯éç项ç®çå大ï¼åéè¦åå«æ建项ç®çä¸åçé¨ä»¶ï¼æç»åç»è£ æ产åãè¿ç§æ建æ¹å¼å¯ä»¥é¿å å 为å±é¨ç»å°çä¿®æ¹å¿å¯¼è´éç°æ建æ´ä¸ªåºç¨ï¼åæ¶ä¸åçæ建æ¥éª¤å¯ä»¥å¾å¥½å°å¹¶åæ§è¡ä»¥æé«æ建æçã
æ们ç°å¨å°ä¸ä¸ªé¡¹ç®æå为两个é¨åç¬ç«æ建ï¼åæ¶è®¾ç½®å®ä»¬ä¹é´çä¾èµå ³ç³»ãåºäºä¸é¢çä¾åï¼æ们éåäºBUILDæ建æ件ï¼
java_binary(
name = "my-other-runner",
srcs = ["src/main/java/com/example/ProjectRunner.java"],
main_class = "com.example.ProjectRunner",
deps = [":greeter"],
)
java_library(
name = "greeter",
srcs = ["src/main/java/com/example/Greeting.java"],
)
è½ç¶æºæ件æ¯ä¸æ ·çï¼ä½æ¯ç°å¨Bazelå°éç¨ä¸åçæ¹å¼æ¥æ建ï¼é¦å æ¯æ建 greeteråºï¼ç¶åæ¯æ建 my-other-runnerãå¯ä»¥å¨æ建æååç«å»è¿è¡ //:my-other-runnerï¼
$ bazel run //:my-other-runner
INFO: Found 1 target...
Target //:my-other-runner up-to-date:
bazel-bin/my-other-runner.jar
bazel-bin/my-other-runner
INFO: Elapsed time: 2.s, Critical Path: 1.s
INFO: Running command line: bazel-bin/my-other-runner
Hi!
ç°å¨å¦æä½ æ¹å¨ProjectRunner.java代ç 并éæ°æ建my-other-runnerç®æ ï¼Greeting.javaæ件å 为没æååèä¸ä¼éç°ç¼è¯ã
使ç¨å¤ä¸ªå ï¼Packagesï¼
对äºæ´å¤§ç项ç®ï¼æ们é常éè¦å°å®ä»¬æåå°å¤ä¸ªç®å½ä¸ãä½ å¯ä»¥ç¨ç±»ä¼¼//path/to/directory:target-nameçååå¼ç¨å¨å ¶ä»BUILDæ件å®ä¹çç®æ ãå设src/main/java/com/example/æä¸ä¸ªcmdline/åç®å½ï¼å å«ä¸é¢çæ件ï¼
$ mkdir -p src/main/java/com/example/cmdline
$ cat > src/main/java/com/example/cmdline/Runner.java <<EOF
package com.example.cmdline;
import com.example.Greeting;
public class Runner {
public static void main(String args[]) {
Greeting.sayHi();
}
}
EOF
Runner.javaä¾èµcom.example.Greetingï¼å æ¤æ们éè¦å¨src/main/java/com/example/cmdline/BUILDæ建æ件ä¸æ·»å ç¸åºçä¾èµè§åï¼
# ~/gitroot/my-project/src/main/java/com/example/cmdline/BUILD
java_binary(
name = "runner",
srcs = ["Runner.java"],
main_class = "com.example.cmdline.Runner",
deps = ["//:greeter"]
)
ç¶èï¼é»è®¤æ åµä¸æ建ç®æ é½æ¯ ç§æ çãä¹å°±æ¯è¯´ï¼æ们åªè½å¨åä¸ä¸ªBUILDæ件ä¸è¢«å¼ç¨ãè¿å¯ä»¥é¿å å°å¾å¤å®ç°çç»èæ´æ¼ç»å ¬å ±çæ¥å£ï¼ä½æ¯ä¹æå³çæ们éè¦æå·¥å 许runneræä¾èµç//:greeterç®æ ãå°±æ¯ç±»ä¼¼ä¸é¢è¿ä¸ªå¨æ建runnerç®æ æ¶éå°çé误ï¼
$ bazel build //src/main/java/com/example/cmdline:runner
ERROR: /home/user/gitroot/my-project/src/main/java/com/example/cmdline/BUILD:2:1:
Target '//:greeter' is not visible from target '//src/main/java/com/example/cmdline:runner'.
Check the visibility declaration of the former target if you think the dependency is legitimate.
ERROR: Analysis of target '//src/main/java/com/example/cmdline:runner' failed; build aborted.
INFO: Elapsed time: 0.s
å¯ç¨éè¿å¨BUILDæ件å¢å visibility = levelå±æ§æ¥æ¹åç®æ çå¯é´èå´ãä¸é¢æ¯éè¿å¨~/gitroot/my-project/BUILDæ件å¢å å¯è§è§åï¼æ¥æ¹ågreeterç®æ çå¯è§èå´ï¼
java_library(
name = "greeter",
srcs = ["src/main/java/com/example/Greeting.java"],
visibility = ["//src/main/java/com/example/cmdline:__pkg__"],
)
è¿ä¸ªè§å表示//:greeterç®æ 对äº//src/main/java/com/example/cmdlineå æ¯å¯è§çãç°å¨æ们å¯ä»¥éæ°æ建runnerç®æ ç¨åºï¼
$ bazel run //src/main/java/com/example/cmdline:runner
INFO: Found 1 target...
Target //src/main/java/com/example/cmdline:runner up-to-date:
bazel-bin/src/main/java/com/example/cmdline/runner.jar
bazel-bin/src/main/java/com/example/cmdline/runner
INFO: Elapsed time: 1.s, Critical Path: 0.s
INFO: Running command line: bazel-bin/src/main/java/com/example/cmdline/runner
Hi!
åèææ¡£ ä¸æå¯è§æ§é 置说æã
é¨ç½²
å¦æä½ æ¥ç bazel-bin/src/main/java/com/example/cmdline/runner.jar çå 容ï¼å¯ä»¥çå°éé¢åªå å«äºRunner.classï¼å¹¶æ²¡æä¿æ¤æä¾èµçGreeting.classï¼
$ jar tf bazel-bin/src/main/java/com/example/cmdline/runner.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/example/
com/example/cmdline/
com/example/cmdline/Runner.class
è¿åªè½å¨æ¬æºæ£å¸¸å·¥ä½ï¼å 为Bazelçrunnerèæ¬å·²ç»å°greeter jaræ·»å å°äºclasspathï¼ï¼ä½æ¯å¦æå°runner.jaråç¬å¤å¶å°å¦ä¸å°æºå¨ä¸è®²ä¸è½æ£å¸¸è¿è¡ãå¦ææ³è¦æ建å¯ç¨äºé¨ç½²åå¸çèªå å«ææä¾èµçç®æ ï¼å¯ä»¥æ建runner_deploy.jarç®æ ï¼ç±»ä¼¼<target-name>_deploy.jar以_deploy为åç¼çåå对åºå¯é¨ç½²ç®æ ï¼ã
$ bazel build //src/main/java/com/example/cmdline:runner_deploy.jar
INFO: Found 1 target...
Target //src/main/java/com/example/cmdline:runner_deploy.jar up-to-date:
bazel-bin/src/main/java/com/example/cmdline/runner_deploy.jar
INFO: Elapsed time: 1.s, Critical Path: 0.s
runner_deploy.jarä¸å°å å«å ¨é¨çä¾èµã
ä¸ä¸æ¥
ç°å¨ï¼æ¨å¯ä»¥å建èªå·±çç®æ 并ç»è£ æç»äº§åäºãæ¥ä¸æ¥ï¼å¯æ¥ç ç¸å ³æç¨ åå«å¦ä¹ å¦ä½ç¨Bazelæ建ä¸ä¸ªæå¡å¨ãAndroidåiOSåºç¨ãä¹å¯ä»¥åè ç¨æ·æåè·å¾æ´å¤çä¿¡æ¯ãå¦ææé®é¢çè¯ï¼å¯ä»¥å° bazel-discuss 论åæé®ã
[推理部署]👉Mac源码编译TensorFlow C++指北
在Mac环境下编译TensorFlow C++源码,需要完成以下步骤,以避免可能的编译问题,确保顺利构建。
首先,确认系统环境满足要求。需有Xcode和Command Line Tools,JDK 1.8.0版本以支持编译过程中所需的Java环境,以及Bazel工具,TensorFlow依赖此工具进行编译。特别注意Bazel版本需与TensorFlow对应,如TensorFlow 1.对应Bazel 0..1。
接下里,安装依赖,包括JDK和Bazel。在线授权系统源码JDK安装时需检查电脑中是否已安装,并确保正确安装。使用HomeBrew安装Bazel,通过命令行接受协议,并使用`--user`指令确保安装在个人目录的`bin`文件夹下,同时设置`.bazelrc`路径为`$HOME/.bazelrc`。
安装自动化工具`automake`和使用Python3.7.5在虚拟环境中构建TensorFlow C++源码。推荐使用清华镜像源加速`pip`的安装过程。通过`git clone`方式下载TensorFlow源码,确保checkout至r1.分支。调整域名映射以提升`git clone`速度。
进行编译选项配置,通常在TensorFlow文件夹内运行命令,根据提示选择默认选项。
开始编译TensorFlow,此过程可能需要较长时间,完成后,管理系统模源码应在`bazel-bin/tensorflow`目录下找到编译好的`libtensorflow_cc.so`和`libtensorflow_framework.1.dylib`文件。
若遇到`Undefined symbols for architecture x_: “_CFRelease”`错误,这通常与创建软连接有关,无需特别处理。若需要手动安装额外依赖库,如Eigen3,可参考相关指南。
编译完成后,可对C++接口进行测试,验证编译过程的正确性。通常情况下,Mac下的TensorFlow 1. C++源码编译完成。
最后,编译TFLite,生成的动态链接库将保存在指定目录下。在`CMakelists.txt`文件中增加对应配置项,以完成TFLite的支付系统源码 asp构建。
总结而言,Mac下TensorFlow 1. C++源码编译及TFLite的构建,需要遵循上述步骤,并确保环境与工具版本的兼容性,以顺利进行编译过程。Linux系统下的编译方式相似,但具体细节可能有所不同。
电脑macOS mojave ..6, 编译tensorflow2.6解决SSE4.1 SSE4.2 AVX指令集问题。
针对macOS mojave ..6系统用户在编译tensorflow 2.6版本时遇到的SSE4.1、SSE4.2和AVX指令集问题,以下为解决步骤:
首先,前往tensorflow源码下载页面,下载v2.6.0版本。
然后,进入下载后的目录,定位至v2.6.0。
接下来,准备必要的软件环境。确保已安装java和minconda。
开始编译tensorflow时,关键在于使用优化指令集。在执行编译命令时,加入参数`-march=native`以进行cpu指令集优化。
使用命令行进行编译:`bazelisk build -c opt --copt=-march=native //tensorflow/tools/pip_package:build_pip_package`。
编译完成后,在/tmp/tensorflow_pkg目录下找到生成的wheel文件。使用pip进行安装,即可完成tensorflow 2.6版本的安装。
完成编译与安装后,用户可根据需要下载tensorflow-2.6.0-cp-cpm-macosx___x_.whl文件。提取码为kkli。
极简入门TensorFlow C++源码
前一段时间,我专注在框架开发上,并偶尔协助业务同学优化使用TensorFlow的代码。在观看dmlc/relay、nnvm的代码时,我发现了它们的有趣之处。我也对TensorFlow的Graph IR、PaddlePaddle的Graph IR产生了兴趣,上周五在阅读代码时,无意间听到了一个数据竞赛群讨论框架的底层实现。几位算法大佬提到了看底层源码可能较为繁琐,因为这类代码通常相对容易理解。在与群内伙伴的交流后,我萌生了撰写一篇关于如何阅读TensorFlow或其他框架底层源码的文章。
选择合适版本的bazel,对于阅读TensorFlow源码至关重要。应使用版本为0..0的bazel来拉取TF2.0代码,因为太高的版本或太低的版本可能影响阅读体验。在安装了合适的bazel版本后,使用clion上的bazel插件进行导入,然后配置编译,导入项目,等待clion编译整个项目。完成编译后,就能愉快地阅读代码,甚至于protobuf生成的文件也能轻松跳转。
使用c++编译模型是TensorFlow的另一面。尝试使用c++编写模型代码,可以深入理解TensorFlow的底层机制。主要函数包括CreateGraphDef、ConcurrentSteps、ConcurrentSessions等。通过这些函数,可以构建计算图,定义节点、常量变量、操作符等。这为理解TensorFlow的逻辑提供了直观的视角。
深入分析代码后,可以了解到TensorFlow的GraphDef机制、Square类的实现、注册到特定op的过程、functor的使用以及最终的实现逻辑。这有助于理解TensorFlow的核心原理,并在阅读源码时进行更深入的思考。
除了阅读源码,还可以通过编写测试用例来增强理解。TensorFlow提供了丰富的测试用例,如在client_session_test.cc中运行测试程序,可以验证代码的正确性。这不仅有助于理解代码,还能提高对TensorFlow框架的掌握程度。
阅读源码只是理解TensorFlow原理的开始,深入行业论文和请教行业专家是进一步深入学习的关键。网络上关于机器学习系统的资料丰富多样,但缺少系统性的课程。希望官方能够分享更多框架的干货,并期待在学习过程中总结和分享更多资源。阅读源码虽然复杂,但其背后蕴含的原理和逻辑十分有趣。