衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是TensorFlow Serving?構(gòu)建CPU優(yōu)化服務(wù)二進(jìn)制代碼

電子工程師 ? 來(lái)源:lp ? 2019-04-04 17:26 ? 次閱讀

TensorFlow已經(jīng)發(fā)展成為事實(shí)上的ML(機(jī)器學(xué)習(xí))平臺(tái),在業(yè)界和研究領(lǐng)域都很流行。對(duì)TensorFlow的需求和支持促成了一系列圍繞培訓(xùn)和服務(wù)ML模型的OSS庫(kù)、工具和框架。TensorFlow Serving是一個(gè)構(gòu)建在分布式生產(chǎn)環(huán)境中、主要為ML模型提供推理服務(wù)的項(xiàng)目。

Mux在其基礎(chǔ)設(shè)施的幾個(gè)部分中使用TensorFlow Serving,我們之前已經(jīng)討論過(guò)使用TensorFlow來(lái)實(shí)現(xiàn)按標(biāo)題編碼(per-title-encoding)功能。今天,我們將重點(diǎn)關(guān)注通過(guò)優(yōu)化預(yù)測(cè)服務(wù)器和客戶端來(lái)改善延遲的技術(shù)。模型預(yù)測(cè)通常是“在線”操作(在關(guān)鍵的應(yīng)用請(qǐng)求路徑上),因此我們的主要優(yōu)化目標(biāo)是以盡可能低的延遲處理大量的請(qǐng)求。

首先,讓我們簡(jiǎn)要介紹一下TensorFlow Serving。

什么是TensorFlow Serving?

TensorFlow Serving提供了靈活的服務(wù)器架構(gòu),旨在部署和服務(wù)ML模型。一旦模型經(jīng)過(guò)訓(xùn)練并可以用于預(yù)測(cè),TensorFlow Serving需要將模型導(dǎo)出到可服務(wù)類(Servable)兼容格式。

Servable是包裝TensorFlow對(duì)象的中心抽象。例如,模型可以表示為一個(gè)或多個(gè)Servable。因此,Servable是客戶端用于執(zhí)行計(jì)算(如推理)的底層對(duì)象。Servable的大小很重要,由于較小的模型使用更少的內(nèi)存、更少的存儲(chǔ),因此將有更快的加載時(shí)間(加載時(shí)間更短)。Servable要求模型以SavedModel格式加載,并使用PerdictAPI提供服務(wù)。

TensorFlow Serving將核心服務(wù)組件組合在一起,構(gòu)建一個(gè)GRPC/HTTP服務(wù)器。該服務(wù)器可以服務(wù)多個(gè)ML模型(或多個(gè)版本),并提供監(jiān)測(cè)組件和可配置的體系結(jié)構(gòu)。

Tensorflow Serving and Docker

讓我們使用標(biāo)準(zhǔn)的TensorFlow Serving獲得基線預(yù)測(cè)性能延遲指標(biāo)(未使用CPU優(yōu)化)。

首先,從TensorFlow Docker hub提取最新的服務(wù)映像文件:

dockerpulltensorflow/serving:latest

在這篇文章中,所有的容器都運(yùn)行在一個(gè)4核、15 GB、Ubuntu 16.04主機(jī)上。

將TensorFlow模型導(dǎo)出到SavedModel格式

使用TensorFlow訓(xùn)練模型時(shí),可以將輸出保存為可變檢查點(diǎn)(磁盤(pán)上的文件)。推理可以通過(guò)恢復(fù)模型檢查點(diǎn)或在其轉(zhuǎn)換的靜態(tài)圖(二進(jìn)制)上直接運(yùn)行。

為了使用TensorFlow服務(wù)這些模型,必須靜態(tài)圖導(dǎo)出到SavedModel格式。TensorFlow文檔可查詢以SavedModel格式導(dǎo)出預(yù)訓(xùn)練模型的示例。

TensorFlow還提供了一系列官方和研究模型作為實(shí)驗(yàn)、研究或生產(chǎn)的入門資料

例如,我們將使用深殘余網(wǎng)絡(luò)(ResNet)模型,可用于對(duì)ImageNet的1000個(gè)類的數(shù)據(jù)集進(jìn)行分類。下載預(yù)訓(xùn)練ResNet-50 v2模型,特別是channels_last (NHWC)卷積SavedModel,這對(duì)于CPU來(lái)說(shuō)通常更好。

在以下結(jié)構(gòu)中復(fù)制RestNet模型目錄:

models/1/saved_model.pbvariables/variables.data-00000-of-00001variables.index

TensorFlow Serving按數(shù)字排序的目錄結(jié)構(gòu)管理模型版本。在本例中,目錄1/對(duì)應(yīng)于模型版本1,其中包含模型體系結(jié)構(gòu)。saved_model.pb以及模型權(quán)重(變量)的快照。

加載和服務(wù)SavedModel

下面的命令在docker容器中啟動(dòng)一個(gè)TensorFlow模型服務(wù)器。為了加載SavedModel,需要將模型的主機(jī)目錄mount到預(yù)期的容器目錄中。

dockerrun-d-p9000:8500\-v$(pwd)/models:/models/resnet-eMODEL_NAME=resnet\-ttensorflow/serving:latest

檢查容器日志,確定ModelServer正在運(yùn)行并可以在GRPC和HTTP端點(diǎn)上為resnet模型提供服務(wù):

Itensorflow_serving/core/loader_harness.cc:86]Successfullyloadedservableversion{name:resnetversion:1}Itensorflow_serving/model_servers/server.cc:286]RunninggRPCModelServerat0.0.0.0:8500...Itensorflow_serving/model_servers/server.cc:302]ExportingHTTP/RESTAPIat:localhost:8501...

預(yù)測(cè)客戶端

TensorFlow將API服務(wù)模式定義為協(xié)議緩沖器(protobuf)。預(yù)測(cè)API的gRPC客戶端用例會(huì)被打包為tensorflow_serving.apis Python包。考慮到實(shí)用功能,我們還需要tensorflow Python包。

讓我們安裝倚賴項(xiàng)(dependencies)創(chuàng)建一個(gè)簡(jiǎn)單的客戶端:

virtualenv.env&&source.env/bin/activate&&\pipinstallnumpygrpcioopencv-pythontensorflowtensorflow-serving-api

ResNet-50 v2模型要求浮點(diǎn)Tensor輸入應(yīng)采用Channel_last(NHWC)格式的數(shù)據(jù)結(jié)構(gòu)。因此,輸入圖像是使用OpenCV-python讀取的,它以32位浮點(diǎn)數(shù)據(jù)類型加載到numpy數(shù)組(高度x寬度x通道)中。下面的腳本創(chuàng)建預(yù)測(cè)客戶端存根,并將JPEG圖像數(shù)據(jù)加載到numpy數(shù)組中,然后轉(zhuǎn)換為TensorProto以發(fā)出GRPC預(yù)測(cè)請(qǐng)求:

#!/usr/bin/envpythonfrom__future__importprint_functionimportargparseimportnumpyasnpimporttimett=time.time()importcv2importtensorflowastffromgrpc.betaimportimplementationsfromtensorflow_serving.apisimportpredict_pb2fromtensorflow_serving.apisimportprediction_service_pb2parser=argparse.ArgumentParser(description='incetiongrpcclientflags.')parser.add_argument('--host',default='0.0.0.0',help='inceptionservinghost')parser.add_argument('--port',default='9000',help='inceptionservingport')parser.add_argument('--image',default='',help='pathtoJPEGimagefile')FLAGS=parser.parse_args()defmain():#createpredictionserviceclientstubchannel=implementations.insecure_channel(FLAGS.host,int(FLAGS.port))stub=prediction_service_pb2.beta_create_PredictionService_stub(channel)#createrequestrequest=predict_pb2.PredictRequest()request.model_spec.name='resnet'request.model_spec.signature_name='serving_default'#readimageintonumpyarrayimg=cv2.imread(FLAGS.image).astype(np.float32)#converttotensorprotoandmakerequest#shapeisinNHWC(num_samplesxheightxwidthxchannels)formattensor=tf.contrib.util.make_tensor_proto(img,shape=[1]+list(img.shape))request.inputs['input'].CopyFrom(tensor)resp=stub.Predict(request,30.0)print('totaltime:{}s'.format(time.time()-tt))if__name__=='__main__':main()

使用JPEG圖像作為輸入,運(yùn)行客戶端的輸出如下所示:

pythontf_serving_client.py--image=images/pupper.jpgtotaltime:2.56152906418s

輸出Tensor的預(yù)測(cè)結(jié)果為一個(gè)整數(shù)值和各特征的概率。

outputs{key:"classes"value{dtype:DT_INT64tensor_shape{dim{size:1}}int64_val:238}}outputs{key:"probabilities"...

對(duì)于單個(gè)請(qǐng)求,這種預(yù)測(cè)延遲是不可接受的。然而,這并非完全出乎意料;默認(rèn)的TensorFlow二進(jìn)制程序的目標(biāo)是支持最廣泛的硬件以覆蓋絕大多數(shù)用例。您可能已經(jīng)從標(biāo)準(zhǔn)的TensorFlow容器日志中注意到:

Iexternal/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:141]YourCPUsupportsinstructionsthatthisTensorFlowbinarywasnotcompiledtouse:AVX2FMA

這表明TensorFlow二進(jìn)制程序運(yùn)行在不兼容的CPU平臺(tái)上,而該平臺(tái)沒(méi)有為其進(jìn)行優(yōu)化。

構(gòu)建CPU優(yōu)化服務(wù)二進(jìn)制代碼

根據(jù) TensorFlow文獻(xiàn)資料,建議從源代碼編譯TensorFlow,并采用運(yùn)行二進(jìn)制文件的主機(jī)平臺(tái)的CPU提供的所有優(yōu)化。TensorFlow給出了Build選項(xiàng)標(biāo)志,以便為特定于平臺(tái)的CPU指令集構(gòu)建二進(jìn)制代碼:

指令集 標(biāo)志
AVX -Copt=-mavx
AVX 2 -Copt=-mavx 2
FMA --copt=-mfma
SSE 4.1 -Copt=-msse4.1
SSE 4.2 -Copt=-msse4.2
全部由處理器支持 --copt=-march=native

克隆TensorFlow固定到特定版本。在這種情況下,我們將使用1.13(發(fā)表此文時(shí)的最新版本):

USER=$1TAG=$2TF_SERVING_VERSION_GIT_BRANCH="r1.13"gitclone--branch="$TF_SERVING_VERSION_GIT_BRANCH"https://github.com/tensorflow/serving

TensorFlow Serving映像使用Bazel作為Build工具。針對(duì)特定處理器CPU指令集的生成目標(biāo)可以用如下方式指定:

TF_SERVING_BUILD_OPTIONS="--copt=-mavx--copt=-mavx2--copt=-mfma--copt=-msse4.1--copt=-msse4.2"

如果內(nèi)存有限制,則使用--local_resources=2048,.5,1.0標(biāo)志。參考TensorFlow與Docker聯(lián)合服務(wù)和Bazel docs的文獻(xiàn)作為這些構(gòu)建標(biāo)志上的資源。

使用開(kāi)發(fā)圖像建立serving image作為服務(wù)基類:

#!/bin/bashUSER=$1TAG=$2TF_SERVING_VERSION_GIT_BRANCH="r1.13"gitclone--branch="${TF_SERVING_VERSION_GIT_BRANCH}"https://github.com/tensorflow/servingTF_SERVING_BUILD_OPTIONS="--copt=-mavx--copt=-mavx2--copt=-mfma--copt=-msse4.1--copt=-msse4.2"cdserving&&\dockerbuild--pull-t$USER/tensorflow-serving-devel:$TAG\--build-argTF_SERVING_VERSION_GIT_BRANCH="${TF_SERVING_VERSION_GIT_BRANCH}"\--build-argTF_SERVING_BUILD_OPTIONS="${TF_SERVING_BUILD_OPTIONS}"\-ftensorflow_serving/tools/docker/Dockerfile.devel.cdserving&&\dockerbuild-t$USER/tensorflow-serving:$TAG\--build-argTF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel:$TAG\-ftensorflow_serving/tools/docker/Dockerfile.

ModelServer可以用TensorFlow專用標(biāo)志配置以啟用會(huì)話并行性。以下選項(xiàng)配置兩個(gè)線程池并行執(zhí)行:

intra_op_parallelism_threads

控制用于單個(gè)操作并行執(zhí)行的最大線程數(shù)。

用于具有固有非倚賴子操作的并行執(zhí)行。

inter_op_parallelism_threads

控制獨(dú)立的不同操作并行執(zhí)行的最大線程數(shù)。

對(duì)TensorFlow Graph的操作彼此獨(dú)立,因此可以在不同的線程上運(yùn)行。

這兩個(gè)選項(xiàng)的默認(rèn)值設(shè)置為0。這意味著,系統(tǒng)選擇一個(gè)適當(dāng)?shù)臄?shù)字,這通常需要每個(gè)CPU核心有一個(gè)線程可用。但是,對(duì)于多核CPU并行性,我們可以手動(dòng)控制。

接下來(lái),按照與之前類似的方式啟動(dòng)服務(wù)容器,這一次使用從源代碼編譯的docker映像,并使用TensorFlow特定的CPU優(yōu)化標(biāo)志:

dockerrun-d-p9000:8500\-v$(pwd)/models:/models/resnet-eMODEL_NAME=resnet\-t$USER/tensorflow-serving:$TAG\--tensorflow_intra_op_parallelism=4\--tensorflow_inter_op_parallelism=4

容器日志應(yīng)該不顯示CPU guard告警。在不更改任何代碼的情況下,運(yùn)行相同的預(yù)測(cè)請(qǐng)求會(huì)使預(yù)測(cè)延遲降低約35.8%:

pythontf_serving_client.py--image=images/pupper.jpgtotaltime:1.64234706879s

提高預(yù)測(cè)客戶端的速度

我們能做得更好嗎?服務(wù)器端已經(jīng)為其CPU平臺(tái)進(jìn)行了優(yōu)化,但超過(guò)1s的預(yù)測(cè)延遲似乎仍然太高。

問(wèn)題是,加載tensorflow_serving和tensorflow庫(kù)確實(shí)會(huì)導(dǎo)致這個(gè)問(wèn)題。每次調(diào)用tf.contrib.util.make_tensor_proto同時(shí)也增加了不必要的延遲開(kāi)銷。

“等等”,你可能在想。“難道我不需要TensorFlow Python包向TensorFlow Server提出預(yù)測(cè)請(qǐng)求嗎?”

答案很簡(jiǎn)單:確實(shí)如此,實(shí)際上不需要tensorflow或tensorflow_serving包發(fā)出預(yù)測(cè)請(qǐng)求。

如前所述,TensorFlow預(yù)測(cè)API被定義為Protobufs。因此,可以通過(guò)生成必要的tensorflow和tensorflow_serving protobuf python 存根(stubs)。這就避免了對(duì)客戶機(jī)本身整個(gè)(巨大)TensorFlow庫(kù)的調(diào)用。

首先,舍棄tensorflow和tensorflow_serving依賴項(xiàng),添加grpcio-tools包。

pipuninstalltensorflowtensorflow-serving-api&&\pipinstallgrpcio-tools==1.0.0

復(fù)制tensorflow/tensorflow和tensorflow/serving存儲(chǔ)庫(kù),并將以下Protobuf文件復(fù)制到客戶端項(xiàng)目中:

tensorflow/serving/tensorflow_serving/apis/model.prototensorflow_serving/apis/predict.prototensorflow_serving/apis/prediction_service.prototensorflow/tensorflow/tensorflow/core/framework/resource_handle.prototensorflow/core/framework/tensor_shape.prototensorflow/core/framework/tensor.prototensorflow/core/framework/types.proto

將上述原型文件復(fù)制到protos/目錄并保存原始路徑:

protos/tensorflow_serving/apis/*.prototensorflow/core/framework/*.proto

為了簡(jiǎn)單起見(jiàn),prediction_service.proto(預(yù)測(cè)服務(wù))可以簡(jiǎn)化為只實(shí)現(xiàn)Predict RPC。這避免了引入服務(wù)中定義的其他RPC的嵌套依賴關(guān)系。這里是簡(jiǎn)化后的prediction_service.proto.

使用grpcio.tools.protoc:

PROTOC_OUT=protos/PROTOS=$(find.|grep"\.proto$")forpin$PROTOS;dopython-mgrpc.tools.protoc-I.--python_out=$PROTOC_OUT--grpc_python_out=$PROTOC_OUT$pdone

現(xiàn)在可以刪除整個(gè)tensorflow_serving模塊:

fromtensorflow_serving.apisimportpredict_pb2fromtensorflow_serving.apisimportprediction_service_pb2

中生成的Probufs替換為protos/tensorflow_serving/apis:

fromprotos.tensorflow_serving.apisimportpredict_pb2fromprotos.tensorflow_serving.apisimportprediction_service_pb2

為了使用幫助函數(shù)make_tensor_proto,導(dǎo)入了TensorFlow庫(kù),也就是用于包裝python/numpy對(duì)象成為TensorProto對(duì)象。

因此,我們可以替換以下依賴項(xiàng)和代碼片段:

importtensorflowastf...tensor=tf.contrib.util.make_tensor_proto(features)request.inputs['inputs'].CopyFrom(tensor)

導(dǎo)入Protobuf,構(gòu)建TensorProto對(duì)象:

fromprotos.tensorflow.core.frameworkimporttensor_pb2fromprotos.tensorflow.core.frameworkimporttensor_shape_pb2fromprotos.tensorflow.core.frameworkimporttypes_pb2...#ensureNHWCshapeandbuildtensorprototensor_shape=[1]+list(img.shape)dims=[tensor_shape_pb2.TensorShapeProto.Dim(size=dim)fordimintensor_shape]tensor_shape=tensor_shape_pb2.TensorShapeProto(dim=dims)tensor=tensor_pb2.TensorProto(dtype=types_pb2.DT_FLOAT,tensor_shape=tensor_shape,float_val=list(img.reshape(-1)))request.inputs['inputs'].CopyFrom(tensor)

完整的python腳本請(qǐng)?jiān)L問(wèn)這里。運(yùn)行更新后的初始客戶端,該客戶端向優(yōu)化的TensorFlow發(fā)出預(yù)測(cè)請(qǐng)求:

pythontf_inception_grpc_client.py--image=images/pupper.jpgtotaltime:0.58314920859s

下圖顯示了針對(duì)標(biāo)準(zhǔn)、優(yōu)化的TensorFlow和客戶端10次運(yùn)行的預(yù)測(cè)請(qǐng)求的延遲:

顯然,從標(biāo)準(zhǔn)TensorFlow到優(yōu)化版的平均延遲下降了約70.4%。

優(yōu)化預(yù)測(cè)吞吐量

TensorFlow Serving也可以配置為高吞吐量處理。對(duì)吞吐量的優(yōu)化通常用于“脫機(jī)”批處理,在這些批處理中,不需要有嚴(yán)格的延遲閥值。

(1) 服務(wù)器端批處理

服務(wù)器端批處理由TensorFlow Serving支持開(kāi)箱即用。.

延遲和吞吐量之間的權(quán)衡取決于所支持的批處理參數(shù)。TensorFlow批處理最有效地利用硬件加速器承諾(保證)的高吞吐量。

若要啟用批處理,請(qǐng)?jiān)O(shè)置--enable_batching和--batching_parameters_file標(biāo)志。可以將批處理參數(shù)設(shè)置為SessionBundleConfig。對(duì)于只使用CPU的系統(tǒng),請(qǐng)考慮設(shè)置num_batch_threads可以使用的核心數(shù)量。批處理配置方法可訪問(wèn)這里,使用支持GPU的系統(tǒng)。

當(dāng)服務(wù)器端的批處理請(qǐng)求全部到達(dá)時(shí),推理請(qǐng)求在內(nèi)部合并為單個(gè)大請(qǐng)求(Tensor),并在合并請(qǐng)求上運(yùn)行一個(gè)TensorFlow會(huì)話。在單個(gè)會(huì)話上運(yùn)行批量請(qǐng)求,可以真正利用CPU/GPU并行性。

批處理過(guò)程中需要考慮的Tensorflow Serving Batching進(jìn)程:

在客戶端使用異步請(qǐng)求,以在服務(wù)器端進(jìn)行批處理

在CPU/GPU上加入模型圖組件,加速批處理

在同一服務(wù)器服務(wù)多個(gè)模型時(shí),對(duì)預(yù)測(cè)請(qǐng)求進(jìn)行交織處理

對(duì)于“脫機(jī)”大容量推理處理,強(qiáng)烈推薦批處理。

(2) 客戶端批處理

客戶端的批處理是將多個(gè)輸入組合在一起,以發(fā)出單個(gè)請(qǐng)求。

由于ResNet模型要求以NHWC格式輸入(第一個(gè)維度是輸入的數(shù)量),所以我們可以將多個(gè)輸入圖像聚合到一個(gè)RPC請(qǐng)求中:

...batch=[]forjpeginos.listdir(FLAGS.images_path):path=os.path.join(FLAGS.images_path,jpeg)img=cv2.imread(path).astype(np.float32)batch.append(img)...batch_np=np.array(batch).astype(np.float32)dims=[tensor_shape_pb2.TensorShapeProto.Dim(size=dim)fordiminbatch_np.shape]t_shape=tensor_shape_pb2.TensorShapeProto(dim=dims)tensor=tensor_pb2.TensorProto(dtype=types_pb2.DT_FLOAT,tensor_shape=t_shape,float_val=list(batched_np.reshape(-1)))request.inputs['inputs'].CopyFrom(tensor)

對(duì)N個(gè)圖像的批處理,響應(yīng)(相應(yīng))的輸出Tensor對(duì)于請(qǐng)求批處理中相同數(shù)量的輸入具有預(yù)測(cè)結(jié)果,在這種情況下,N=2(以下是N=2的情況):

outputs{key:"classes"value{dtype:DT_INT64tensor_shape{dim{size:2}}int64_val:238int64_val:121}}...

硬件加速

關(guān)于GPU:

對(duì)于訓(xùn)練,GPU可以更直觀地利用并行化,因?yàn)闃?gòu)建深層神經(jīng)網(wǎng)絡(luò)需要大量的計(jì)算才能得到最優(yōu)解。

然而,推理的情況并不總是如此。很多時(shí)候,當(dāng)圖形執(zhí)行步驟放置在GPU設(shè)備上時(shí),CNN的推理就會(huì)加快。然而,挑選能夠優(yōu)化性價(jià)比的硬件,需要進(jìn)行嚴(yán)格的測(cè)試、深入的技術(shù)和成本分析。硬件加速并行化對(duì)于“脫機(jī)”推理批處理(海量卷)更有價(jià)值。

在引入GPU處理之前,要考慮業(yè)務(wù)需求,并對(duì)收益(嚴(yán)格延遲、高吞吐量)進(jìn)行徹底的成本(貨幣、操作、技術(shù))分析。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10902

    瀏覽量

    213002
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    796

    瀏覽量

    41757
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    329

    瀏覽量

    60630

原文標(biāo)題:如何將TensorFlow Serving的性能提高超過(guò)70%?

文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙二進(jìn)制數(shù)組創(chuàng)建

    你data是非unsigned char。你里面的數(shù)據(jù)就會(huì)轉(zhuǎn)換錯(cuò)亂,導(dǎo)致二進(jìn)制的數(shù)據(jù)無(wú)法再轉(zhuǎn)換成正確的字符串 代碼實(shí)例 錯(cuò)誤的代碼例子: ? //接收
    的頭像 發(fā)表于 01-31 15:24 ?1340次閱讀

    如何使用Arduino和LED矩陣構(gòu)建簡(jiǎn)單的二進(jìn)制時(shí)鐘

    在這個(gè)初學(xué)者項(xiàng)目中,我們通過(guò)構(gòu)建LED矩陣和使用Arduino來(lái)創(chuàng)建二進(jìn)制時(shí)鐘。
    的頭像 發(fā)表于 07-25 18:51 ?5831次閱讀

    可以使用我們提供的二進(jìn)制包, 或者使用源代碼, 安裝 TensorFlow

    可以使用我們提供的二進(jìn)制包, 或者使用源代碼, 安裝 TensorFlow
    發(fā)表于 03-30 22:11

    如何丟棄函數(shù)的二進(jìn)制代碼填入SRAM的二進(jìn)制代碼

    應(yīng)用程序 : 示例代碼演示了如何丟棄函數(shù)的二進(jìn)制代碼, 然后填入 SRAM 的二進(jìn)制代碼, 然后調(diào)用它 。 BSP版本:M451系列BSP
    發(fā)表于 08-23 06:34

    二進(jìn)制

    二進(jìn)制   二進(jìn)制與十進(jìn)制的區(qū)別在于數(shù)碼的個(gè)數(shù)和進(jìn)位規(guī)律有很大的區(qū)別,顧名思義,二進(jìn)制的計(jì)數(shù)規(guī)律為逢二進(jìn)一,是以2為基數(shù)的計(jì)數(shù)體制。10這
    發(fā)表于 04-06 23:48 ?8244次閱讀
    <b class='flag-5'>二進(jìn)制</b>

    二進(jìn)制編碼和二進(jìn)制數(shù)據(jù)

    二進(jìn)制編碼和二進(jìn)制數(shù)據(jù)   二進(jìn)制編碼是計(jì)算機(jī)內(nèi)使用最多的碼制,它只使用兩個(gè)基本符號(hào)"0"和"1",并且通過(guò)由這兩個(gè)符號(hào)組成的
    發(fā)表于 10-13 16:22 ?4823次閱讀

    什么是二進(jìn)制計(jì)數(shù)器,二進(jìn)制計(jì)數(shù)器原理是什么?

    什么是二進(jìn)制計(jì)數(shù)器,二進(jìn)制計(jì)數(shù)器原理是什么? 計(jì)數(shù)器是數(shù)字系統(tǒng)中用得較多的基本邏輯器件。它不僅能記錄輸入時(shí)鐘脈沖的個(gè)數(shù),還可以實(shí)現(xiàn)
    發(fā)表于 03-08 13:16 ?3.1w次閱讀

    二進(jìn)制電平,什么是二進(jìn)制電平

    二進(jìn)制電平,什么是二進(jìn)制電平 在二進(jìn)制數(shù)字通信系統(tǒng)中,每個(gè)碼元或每個(gè)符號(hào)只能是“1”和“0”兩個(gè)狀態(tài)之一。若將每個(gè)碼元可能取的狀態(tài)增
    發(fā)表于 03-17 16:51 ?2370次閱讀

    二進(jìn)制加法程序【匯編版】

    二進(jìn)制加法程序【匯編版】二進(jìn)制加法程序【匯編版】二進(jìn)制加法程序【匯編版】二進(jìn)制加法程序【匯編版】
    發(fā)表于 12-29 11:02 ?0次下載

    基于軟件二進(jìn)制代碼重用技術(shù)綜述

    在當(dāng)前的計(jì)算機(jī)系統(tǒng)架構(gòu)和軟件生態(tài)環(huán)境下,ROP(return-oriented programming)等基于二進(jìn)制代碼重用的攻擊技術(shù)被廣泛用于內(nèi)存漏洞利用.近年來(lái)。網(wǎng)絡(luò)空間安全形勢(shì)愈加嚴(yán)峻。學(xué)術(shù)界
    發(fā)表于 12-26 15:31 ?0次下載
    基于軟件<b class='flag-5'>二進(jìn)制</b><b class='flag-5'>代碼</b>重用技術(shù)綜述

    格雷碼與二進(jìn)制的轉(zhuǎn)換

    格雷碼,又叫循環(huán)二進(jìn)制碼或反射二進(jìn)制碼,格雷碼是我們?cè)诠こ讨谐?huì)遇到的一種編碼方式,它的基本的特點(diǎn)就是任意兩個(gè)相鄰的代碼只有一位二進(jìn)制數(shù)不同,這點(diǎn)在下面會(huì)詳細(xì)講解到。格雷碼的基本特點(diǎn)就
    的頭像 發(fā)表于 03-02 15:48 ?1.8w次閱讀
    格雷碼與<b class='flag-5'>二進(jìn)制</b>的轉(zhuǎn)換

    機(jī)器學(xué)習(xí)模型的最簡(jiǎn)單方法之一將TensorFlow Serving與Docker結(jié)合起來(lái)

    TensorFlow Serving 已發(fā)布的 Docker 鏡像旨在竭盡所能來(lái)使用 CPU 架構(gòu),因此省略了一些優(yōu)化以最大限度地提高兼容性。如果您沒(méi)有看到此消息,則您的
    的頭像 發(fā)表于 11-06 11:12 ?9831次閱讀

    二進(jìn)制代碼相似度比較研究技術(shù)匯總

    我們知道編譯生成二進(jìn)制代碼的影響因素非常的多,同一套源代碼基于不同因素的組合可以生成非常多不同二進(jìn)制程序。
    的頭像 發(fā)表于 10-13 08:59 ?1043次閱讀
    <b class='flag-5'>二進(jìn)制</b><b class='flag-5'>代碼</b>相似度比較研究技術(shù)匯總

    構(gòu)建LED二進(jìn)制計(jì)數(shù)器

    電子發(fā)燒友網(wǎng)站提供《構(gòu)建LED二進(jìn)制計(jì)數(shù)器.zip》資料免費(fèi)下載
    發(fā)表于 06-12 09:54 ?3次下載
    <b class='flag-5'>構(gòu)建</b>LED<b class='flag-5'>二進(jìn)制</b>計(jì)數(shù)器

    二進(jìn)制編碼器工作原理 如何選擇二進(jìn)制編碼器

    二進(jìn)制編碼器是一種數(shù)字電路,它將輸入的二進(jìn)制代碼轉(zhuǎn)換為對(duì)應(yīng)的輸出信號(hào)。在數(shù)字系統(tǒng)中,編碼器用于將數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式,以便于處理和傳輸。 二進(jìn)制編碼器工作原理 輸入與輸出關(guān)系
    的頭像 發(fā)表于 11-06 09:44 ?1153次閱讀
    七胜百家乐娱乐| 百家乐色子玩法| 网上真钱老虎机| 做生意选店铺位置| 百家乐官网单注技巧| 澳门玩百家乐00| 百家乐官网游戏什么时间容易出对| 九龙坡区| 百家乐德州| 哪个百家乐最好| 百家乐官网投注限额| 脉动棋牌下载| 专业百家乐筹码| 真人百家乐官网新开户送彩金| 德州扑克大赛视频| 百家乐家居| 鑫鼎百家乐官网的玩法技巧和规则| 蒙特卡罗娱乐| 黄金城百家乐苹果版| 百家乐游戏策略| 百家乐官网中庄闲比例| 西林县| 大发888官方888| 百家乐发牌牌规| 百家乐网址多少| 新加坡百家乐官网赌法| 投注平台出租| 水果机游戏| 百家乐的赚钱原理| 百家乐官网的出千手法| 百家乐官网tt娱乐| 德州扑克看牌器| 威尼斯人娱乐城正规吗| 百家乐娱乐城博彩正网| 芝加哥百家乐官网的玩法技巧和规则| 百家乐官网天下第一缆| 88娱乐城官网| 大发888博彩论坛贴吧| 定做百家乐桌子| 属虎属鼠合伙做生意吗| 百家乐官网电投软件|