皮皮网
皮皮网

【service 自启动源码】【公益平台源码】【作图源码软件】bazel源码

时间:2024-12-27 15:29:24 来源:androidview源码

1.TF-TRT使用环境搭建
2.如何使用bazel build
3.[推理部署]👉Mac源码编译TensorFlow C++指北
4.从源码build Tensorflow2.6.5的记录
5.ONOS 从零入门教学 (应用程式新增,安装及测试)
6.极简入门TensorFlow C++源码

bazel源码

TF-TRT使用环境搭建

       TF-TRT,即TensorFlow与TensorRT的集成,是NVIDIA为加速深度学习推理应用而设计的工具。它简化了TensorFlow用户在GPU上利用TensorRT进行模型推理的流程。本文主要介绍如何在服务器上搭建TF-TRT的service 自启动源码使用环境和编写相关代码。

       首先,NVIDIA推荐的TF-TRT环境配置基于TensorRT 5.0RC,需要确保NVIDIA驱动程序版本.0以上,CUDA .0以及TensorRT。安装过程建议在Anaconda的虚拟环境中进行,从Tensorflow GitHub上下载1.版本源码,并通过bazel build工具生成pip安装包。在编译时,由于GCC 5.0可能与新版本兼容性问题,需添加特定编译选项。

       对于服务器上直接安装,你需按照官方教程安装CUDA、CUDNN、NVIDIA Driver和TensorRT。在Tensorflow的公益平台源码configure文件中,根据你的硬件配置进行相应的调整。然后,通过pip安装生成的.whl文件,安装时需要注意选择nvcc编译器,cudnn 7.3以上版本,以及兼容性的GCC编译选项。

       另一种方式是利用Docker容器,Tensorflow .容器需要nvidia driver +版本,并需要获取Nvidia GPU cloud的API密钥。安装完成后,你可以通过Docker拉取tensorflow:.-py3镜像,验证TensorRT与Tensorflow的集成是否成功。

       无论是直接安装还是容器化,都需注意选择合适的驱动和软件版本,以确保TF-TRT的稳定运行。安装过程中,还可以根据实际需求在container中安装其他软件,以满足个性化需求。

如何使用bazel build

       å®‰è£…

       å®‰è£…过程请参考: /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++源码。windows源码解析推荐使用清华镜像源加速`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系统下的编译方式相似,但具体细节可能有所不同。

从源码build Tensorflow2.6.5的记录

       .从源码编译Tensorflow2.6.5踩坑记录,笔者经过一天的努力,失败四次后终于成功。Tensorflow2.6.5是截至.时,能够从源码编译的最新版本。

       0 - 前期准备

       为了对Tensorflow进行大规模修改并完成科研工作,笔者有从源码编译Tensorflow的需求。平时更常用的做法是在conda环境中pip install tensorflow,有时为了环境隔离方便打包,会用docker先套住,再上conda + pip安装。

       1 - 资料汇总

       教程参考:

       另注:bazel的编译可以使用换源清华镜像(不是必要)。整体配置流程的根本依据还是官方的教程,但它的教程有些点和坑没有涉及到,所以多方材料了解。

       2 - 整体流程

       2.1 确定配置目标

       官网上给到了配置目标,和对应的版本匹配关系(这张表里缺少了对numpy的版本要求)。笔者最后(在docker中)配置成功的版本为tensorflow2.6.5 numpy1..5 Python3.7. GCC7.5.0 CUDA.3 Bazel3.7.2。

       2.2 开始配置

       为了打包方便和编译环境隔离,在docker中进行了以下配置:

       2. 安装TensorFlow pip软件包依赖项,其编译过程依赖于这些包。

       3. Git Tensorflow源代码包。

       4. 安装编译工具Bazel。

       官网的介绍:(1)您需要安装Bazel,才能构建TensorFlow。您可以使用Bazelisk轻松安装Bazel,并且Bazelisk可以自动为TensorFlow下载合适的Bazel版本。为便于使用,请在PATH中将Bazelisk添加为bazel可执行文件。(2)如果没有Bazelisk,您可以手动安装Bazel。请务必安装受支持的Bazel版本,可以是tensorflow/configure.py中指定的介于_TF_MIN_BAZEL_VERSION和_TF_MAX_BAZEL_VERSION之间的任意版本。

       但笔者尝试最快的安装方式是,到Github - bazelbuild/build/releases上下载对应的版本,然后使用sh脚本手动安装。比如依据刚才的配置目标,笔者需要的是Bazel3.7.2,所以下载的文件为bazel-3.7.2-installer-linux-x_.sh。

       5. 配置编译build选项

       官网介绍:通过运行TensorFlow源代码树根目录下的./configure配置系统build。此脚本会提示您指定TensorFlow依赖项的位置,并要求指定其他构建配置选项(例如,编译器标记)。

       这一步就是选择y/N基本没啥问题,其他参考里都有贴实例。笔者需要GPU的支持,故在CUDA那一栏选择了y,其他部分如Rocm部分就是N(直接按enter也可以)。

       6.开始编译

       编译完成应输出

       7.检查TF是否能用

       3 - 踩坑记录

       3.1 cuda.0在编译时不支持sm_

       笔者最初选择的docker是cuda.0的,在bazel build --config=cuda //tensorflow/tools/pip_package:build_pip_package过程中出现了错误。所以之后选择了上面提到的cuda.3的docker。

       3.2 问题2: numpy、TF、python版本匹配

       在配置过程中,发现numpy、TF、python版本需要匹配,否则会出现错误。

       4 - 启示

       从源码编译Tensorflow2.6.5的过程,虽然经历了多次失败,但最终还是成功。这个过程也让我对Tensorflow的编译流程有了更深入的了解,同时也提醒我在后续的工作中要注意版本匹配问题。

ONOS 从零入门教学 (应用程式新增,安装及测试)

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

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

       ONOS还提供了图形用户界面(UI)界面,预设使用端口。你可以通过ile.cc`。

       5. **交叉编译执行**:利用 LLVM 工具链结合 arm-linux-gnueabihf-binutils 进行交叉编译。

       6. **构建输出**:运行特定编译脚本(通常封装为 `.sh` 文件)生成目标平台可执行文件(如 `hello`),随后将该文件传输至树莓派等目标平台进行执行。

       推荐阅读资源:

       4. **[野火]i.MX Linux开发实战指南**:该文档提供了一个全面且详细的交叉编译指南,虽然不直接支持 MacOS,但通过开启 Docker 环境,可以轻松实现 MacOS 下的交叉编译。

       Crosstool-ng:尽管这是 MacOS 下公认的交叉编译解决方案,但其操作复杂,且存在系统崩溃风险。对于坚持使用此方案的开发者,可参考他人提供的 Docker 镜像,例如 **Dockfile**,但同样建议考虑使用更易管理的 Linux 操作系统(如 Ubuntu)作为 Docker 容器的基础环境。

更多内容请点击【娱乐】专栏