本站提倡有节制游戏,合理安排游戏时间,注意劳逸结合。

【html见缝插针源码】【尚捷云源码】【51商城网站源码】bazel源码 安装

2024-11-30 06:49:19 来源:知识 分类:知识

1.bazelԴ?码安? ??װ
2.从源码build Tensorflow2.6.5的记录
3.TF-TRT使用环境搭建
4.实战!用Bazel来管理iOS程序
5.如何使用bazel build
6.[推理部署]👉Mac源码编译TensorFlow C++指北

bazel源码 安装

bazelԴ?码安? ??װ

       本文将介绍如何从零开始学习并使用ONOS,包括安装、码安配置和测试。码安首先,码安你需要获取ONOS的码安html见缝插针源码源代码并将其添加到.bashrc或.bash_profile中,使用预设的码安alias进行操作。然后使用构建工具(原为buck,码安现已更改为bazel)构建ONOS,码安并进行单元测试。码安

       接下来,码安你可以在本地计算机上启动ONOS服务器,码安使用另一个终端开启ONOS控制台。码安成功后,码安会看到ONOS预设使用端口作为控制台。码安此时,恭喜你,已经成功在本地机上启动了ONOS。尚捷云源码

       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。51商城网站源码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的有序抖动算法源码构建。

       总结而言,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原理的开始,深入行业论文和请教行业专家是进一步深入学习的关键。网络上关于机器学习系统的资料丰富多样,但缺少系统性的课程。希望官方能够分享更多框架的干货,并期待在学习过程中总结和分享更多资源。阅读源码虽然复杂,但其背后蕴含的原理和逻辑十分有趣。

相关推荐
一周热点