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

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

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

結(jié)合Rosetta介紹如何定制化改造TensorFlow前后端相關(guān)組件

Tensorflowers ? 來源:TensorFlow ? 作者:TensorFlow ? 2020-11-26 09:36 ? 次閱讀

本文來自社區(qū)投稿與征集,作者Rosetta 技術(shù)團隊。本文源自他們在 GDG 活動中的分享。

引言

我們之前分享了:【技術(shù)分享】隱私 AI 工程技術(shù)實踐指南,從整體上了介紹了基于深度學(xué)習(xí)框架開發(fā)隱私 AI 框架的?程挑戰(zhàn)和可?解決?案。在本文中,我們將進(jìn)?步結(jié)合 Rosetta 介紹如何定制化改造 TensorFlow 前后端相關(guān)組件,以集成 MPC (Multi-Party Computation) 等隱私計算技術(shù),同時保留對 TensorFlow 接口 API 的復(fù)?,從?實現(xiàn)我們上?篇?章中所強調(diào)的“系統(tǒng)易?性”。

?前 Rosetta 主要基于 TensorFlow 1.14 CPU 版本加以開發(fā)(以下簡稱 TensorFlow 為 TF),這是因為 TF 1.x ?前在?業(yè)界中實際應(yīng)?較為?泛,?引?動態(tài)圖等?級功能的 TF 2.0,則由于接?不向后兼容等問題,仍沒有得到?規(guī)模落地。后續(xù)我們也將在 Rosetta 本身功能穩(wěn)定的基礎(chǔ)上考慮?持 TF 2.0。下?就讓我們開始吧。

TensorFlow 快速回顧

想要基于 AI 框架進(jìn)?步擴展引?隱私計算功能,第?步需要?較深?地了解這些 AI 框架,所以?先讓我們簡單回顧?下 TF 的核?概念以及宏觀的內(nèi)部處理過程。

TensorFlow 核心概念

Tensor(張量)

深度學(xué)習(xí)需要完成對?量?維度復(fù)雜數(shù)據(jù)的處理,在 TensorFlow 中,? Tensor 來封裝同?類型數(shù)據(jù)的?維數(shù)組。其中,基礎(chǔ)類型除了各種不同精度的整數(shù)、浮點數(shù)外,還?持 tf.string 類型,這給我們提供了進(jìn)??定義類型改造的可能性。

?個三維 Tensor(圖?來??絡(luò))

Operation(算?)

Operation(算?,有時也稱“操作”)?來封裝對于 Tensor 的處理邏輯。同時也是連接 TF 的前端和后端之間邏輯處理的基本單元,在實際使?中,?戶可以使? Keras 等上層封裝 API 更?便的表達(dá)復(fù)雜計算邏輯,但是這些上層模塊的內(nèi)部,最終也會調(diào)?各個算?來完成邏輯的表達(dá)。

Graph(計算圖)

?戶在 TF 前端調(diào)?各 API 形成的完整計算邏輯,在內(nèi)部會以 data?ow graph 的形式來表達(dá)。在這?有向?環(huán)圖 (DAG) 上,以算?等作為節(jié)點,以 Tesnor 等作為邊來指明數(shù)據(jù)的流動路徑。在 graph 上,有些節(jié)點是 TF 框架?身根據(jù)需要添加的,?如,?戶在 training 算法階段時,只需要調(diào)?各種優(yōu)化器 (Optimizer) 的 minimize ?法,TF ?身就會?動找到前向圖中各算?所對應(yīng)的梯度算?,并按照數(shù)學(xué)上的鏈?zhǔn)角髮?dǎo)法則,構(gòu)建出反向梯度?圖。

TensorFlow 數(shù)據(jù)流計算圖

Session(會話)

Session 主要是在實際執(zhí)? graph 時對?次執(zhí)?的上下?進(jìn)?維護處理。當(dāng)?戶調(diào)?其 run ?法時,TF 就會分析為了獲取這?次的計算?標(biāo)所需要運?的?圖,并結(jié)合 TF 內(nèi)置的強?的并?優(yōu)化、分布式執(zhí)?等模塊,將所需要執(zhí)?的邏輯進(jìn)?步拆分為各個?圖,各?映射到當(dāng)前的可?設(shè)備資源上,最終調(diào)度這些設(shè)備以并?的?式?效完成計算任務(wù)。

TensorFlow 分布式并?執(zhí)?(圖?來??絡(luò))

TensorFlow 的 codebase 本身還是很復(fù)雜的,篇幅所限,難以在此對 TensorFlow 進(jìn)?深?的介紹,感興趣的讀者可以參考 TensorFlow 公眾號(TensorFlow_official) 上其他優(yōu)秀?章以進(jìn)?步學(xué)習(xí) TensorFlow。

TensorFlow 自定義算子庫的擴展方法

TF 提供了?較豐富的擴展?法,除了在 Python 層可以基于內(nèi)置的豐富算?集合,通過模塊的繼承、組裝等?式得到?定義的功能之外,還可以在后端 C++ 層?定義??的算?[2]。在后端基于 CustomC++op 機制進(jìn)?擴展相?于在前端層進(jìn)?擴展有?些特別的優(yōu)勢:

有時候基于現(xiàn)有 TF 原?算?表達(dá)上層?定義邏輯很困難,?在后端實現(xiàn)則更靈活?由;

通過后端 CustomC++op,可以以更加?效的?式實現(xiàn)??的邏輯,可以在其中進(jìn)?更底層的、?向編譯器等的各種優(yōu)化;

整體上看,基于 TF 的擴展?具,使? customC++op,只需要完成以下四步即可:

1. 通過 TF 提供的 C++ 宏?具注冊新的 op。這主要是定義好這個 op 的輸?輸出類型、名稱等接?信息。例如在 Rosetta 中可以如下定義?個新的 op:

REGISTER_OP("RttMatmul") .Input("x: string") .Input("y: string") .Output("res: string") .Attr("transpose_a: bool = false") .Attr("transpose_b: bool = false") .SetIsStateful();

2. 在 C++ 中具體的實現(xiàn)這個 op 所對應(yīng)的內(nèi)部處理邏輯,這就是所謂的后端 “kernel”。TF 提供了?些?便的基類接?,?戶?般只需要定義?個?類,override 實現(xiàn)其中的 compute ?法即可,例如:

template class RttMatMulOp :public OpKernel { public: explicit RttMatMulOp(OpKernelConstruction* context) : OpKernel(context) { OP_REQUIRES_OK(context, context->GetAttr("transpose_a", &transpose_a_)); OP_REQUIRES_OK(context, context->GetAttr("transpose_b", &transpose_b_)); } void Compute(OpKernelContext* context) override { // Check if the dimensions of the two matrices are valid const Tensor& x = context->input(0); const Tensor& y = context->input(1); // detailed implementation... } }

3. 基于 REGISTER_KERNEL_BUILDER 這樣的宏,將上?所定義的接?和內(nèi)部的實現(xiàn)給綁定起來。這是因為 TF ?持基于不同的輸?、輸出類型和所運?的底層設(shè)備架構(gòu)來定義同?個算?不同的內(nèi)部實現(xiàn),所以?戶可以定義多種 kernel 實現(xiàn),告知給系統(tǒng)什么場景下運?具體哪?個 kernel,在實際運?時,TF 就可以根據(jù)不同的設(shè)備、數(shù)據(jù)流上下?調(diào)?不同的 kernel 來實際執(zhí)?此 op。例如:

REGISTER_KERNEL_BUILDER(Name("RttMatmul").Device(DEVICE_CPU), RttMatMulOp);

4. 將你的后端算?庫編譯為?個動態(tài)庫 so ?件后,在 Python 層調(diào)?接?引?此模塊,然后就可以如同調(diào)?原?算??樣的?式來調(diào)?這些?定義算?了。例如:

# load librtt_ops.so _rtt_ops_lib = os.path.dirname(__file__) + '/../../../librtt-ops.so' rtt_ops = tf.load_op_library(_rtt_ops_lib) # now, you can use the ops in this library as rtt_ops.rtt_matmul

如果你需要在模型訓(xùn)練程序中調(diào)?這個?定義算?,你還需要在 Python 層通過 @ops.RegisterGradient("XXXOp") 來注冊這個算?對應(yīng)的梯度算?,通過這種?式,TF 就可以在?動構(gòu)建反向梯度圖時?動的實現(xiàn)對?定義算?梯度的集成。

Rosetta 利用 TF 這?擴展機制引?兩類算?:中間過渡層 RttOps 算?庫和隱私計算 SecureOps 算?庫,前者是為了?持?向?定義數(shù)據(jù)類型的計算圖的構(gòu)建,后者是為了對接后端隱私計算功能,并在執(zhí)?圖時進(jìn)?動態(tài)綁定。之所以從設(shè)計上區(qū)分這兩類算?,是因為可以進(jìn)?步解耦圖的構(gòu)建和圖的執(zhí)?,提供更多的靈活性。引?了這兩個基礎(chǔ)的算?庫之后,就可以進(jìn)?步的進(jìn)?整體的改造了。

RttOp 算?庫
與后端 MPC 隱私計算完全?關(guān)的輔助中間層,?系列的“浮標(biāo)”置位算?,?持?定義Tensor類型。其內(nèi)部默認(rèn)的實現(xiàn)邏輯是和對應(yīng)的 TF 原?算??樣的。

SecureOp 算?庫
完整的前后端算?庫,注冊了對應(yīng)的梯度函數(shù);在內(nèi)部實現(xiàn)中調(diào)?隱私協(xié)議層的抽象算?接?實現(xiàn)和 TF 的對接。

Rosetta 對 TensorFlow 的深度定制化

如上?篇?章整體介紹的那樣,作為?向?qū)嶋H?業(yè)落地?標(biāo)的隱私 AI 框架,Rosetta 對于 TF 的改造原則始終是為了提供更加便于 AI 開發(fā)者使?的上層接?,以及兼顧系統(tǒng)后端隱私協(xié)議的可擴展性。

Rosetta 整體?程架構(gòu)

從系統(tǒng)架構(gòu)和代碼上看,改造的??可以分為兩?部分:

后端 C++ 部分的適配定制。主要以?定義算?的 kernel 形式進(jìn)?適配。?部分接?的輸?輸出參數(shù)是以 tf.string 基礎(chǔ)類型的 Tensor,??封裝的是?定義的密?數(shù)據(jù)。在隱私算? SecureOps 的 kernel 內(nèi)部會進(jìn)?步調(diào)?統(tǒng)?的密碼協(xié)議接?來完成 TF 到隱私計算功能的聯(lián)通。

前端 Python 部分的適配定制。這?除了在 Python 前端引?我們?定義的算?庫之外,還需要進(jìn)?步改造 TF 中的?動求導(dǎo)功能等模塊以實現(xiàn)對于新隱私算?的?動構(gòu)建圖、?動求導(dǎo)的?持。

從對程序的動態(tài)處理?度來看,如前?篇?章所說,Rosetta 是經(jīng)過兩個階段的 Pass,來完成到底層多?協(xié)作的 MPC 處理程序的轉(zhuǎn)換。這??部分基于 TF 的前后端改造都是為了完成 StaticPass 階段的轉(zhuǎn)換,即將原? Tensor 轉(zhuǎn)換為?持?定義密?類型的 RttTensor,將原? Operation 轉(zhuǎn)換為?持 tf.string 格式輸?輸出的 RttOp ,并最終在圖開始啟動時進(jìn)?步的轉(zhuǎn)換為承載實際 MPC 操作的 SecureOp 。

細(xì)?的讀者可以看出,上?在介紹 TF 的 customC++op 擴展機制的同時,我們已經(jīng)展示了如何定義 Rosetta 中的單個新算?。接下來,我們介紹?下如何基于這些算?實現(xiàn)計算圖的分階段轉(zhuǎn)換。

計算圖的轉(zhuǎn)換構(gòu)建過程

引入 rosetta 庫時

?戶在前端執(zhí)? import lattciex.rosetta 之后,Rosetta 就會? RttOp 靜態(tài)替換掉原? TF 中對應(yīng)的原? API 算?,且各個原? Tensor 也會被包裝?層到 RttTensor ,其與原? Tensor 的主要區(qū)別是,其數(shù)據(jù)的基礎(chǔ)類型是 tf.string,且對應(yīng)的計算算?是 RttOp。這種基礎(chǔ)類型的轉(zhuǎn)換是基于 RttOp 算?庫中的 TfToRtt 和 RttToTf 兩個?于類型轉(zhuǎn)換的算?來完成的。

Rosetta在import時的靜態(tài)替換

調(diào)用 Session.run 接口時

我們同樣 hook 了 Session.run ??,在其內(nèi)部完成從上?步驟中 RttOp 算?到 SecureOp 算?的轉(zhuǎn)換。如果?戶使? TensorBoard ?具查看此時的運?圖,就會看到我們在圖上添加了?個和原? TF 計算圖基本同構(gòu)的新?圖,這個?圖就是由 SecureOp 構(gòu)成。

TensorBoard 可以查看得到的 SecureOp 計算圖

和上?介紹的原? TF 中的完整圖構(gòu)建過程?樣,如果?戶的程序含有模型訓(xùn)練過程,調(diào)?了優(yōu)化器 Optimizer 的 minimize ?法,則我們還需要完成對 SecureOp 的反向梯度圖?動?成的?持。

?先,我們需要注冊各個 SecureOp 算?所對應(yīng)的梯度函數(shù)。?如對于隱私矩陣乘法算? SecureMatMul,我們按照底層梯度的計算邏輯,定義其梯度函數(shù)如下:

@ops.RegisterGradient("SecureMatmul") def SecureMatMulGrad(op, grad): """The gradient for the Secure MatMul operator.""" t_a = op.get_attr("transpose_a") t_b = op.get_attr("transpose_b") a = op.inputs[0] b = op.inputs[1] if not t_a and not t_b: grad_a = SecureMatMul(grad, b, transpose_b=True) grad_b = SecureMatMul(a, grad, transpose_a=True) elif not t_a and t_b: grad_a = SecureMatMul(grad, b) grad_b = SecureMatMul(grad, a, transpose_a=True) elif t_a and not t_b: grad_a = SecureMatMul(b, grad, transpose_b=True) grad_b = SecureMatMul(a, grad) elif t_a and t_b: grad_a = SecureMatMul(b, grad, transpose_a=True, transpose_b=True) grad_b = SecureMatMul(grad, a, transpose_a=True, transpose_b=True) return grad_a, grad_b

此外,由于我們使? tf.string 來統(tǒng)?承載?定義的密?數(shù)據(jù)類型,? TF 本身是不?持對于 tf.string 類型算?的?動求導(dǎo)的,所以 Rosetta 中還對 tf.python.ops.gradients_util 等??進(jìn)?了 hook 改造。?如,在下?這?,我們設(shè)定當(dāng) tensor 的基礎(chǔ)類型為 string 時仍可以繼續(xù)進(jìn)?反向傳播:

反向梯度圖的?動?成

通過這些精細(xì)的定制化改造,最終就可以實現(xiàn)反向梯度?圖的?動?成,可以極?的降低?戶上?隱私計算的開發(fā)難度。

補充說明

并?所有的算?都需要轉(zhuǎn)換為 SecureOp,這是因為如果?個局部?圖中全部的輸?都是本地的常量(公開的寫定到代碼中的數(shù)據(jù),?需保護),那么就沒有必要將這個?圖轉(zhuǎn)換為多?協(xié)作的隱私計算?式計算,這樣可以減少不必要的計算時間。

轉(zhuǎn)換時,由于此時知道了即將運?的完整?圖的信息,?如 DAG 圖上有多少了算?需要運?,所以可以在這?進(jìn)??些定制化的優(yōu)化,?如優(yōu)化底層協(xié)議中多?之間的并發(fā)通訊。

在通過上述過程完成在前端層到 SecureOp 圖的構(gòu)建后,接下?就是依賴 TensorFlow ?身的圖執(zhí)?引擎來調(diào)度執(zhí)?各個 SecureOp 的后端實現(xiàn)了,在這個 kernal 中,為了和具體使?的隱私計算技術(shù)解耦,我們所調(diào)?的是密碼協(xié)議接?,?如 SecureMatMul ?最終通過如下代碼?段來調(diào)?內(nèi)部“隱私計算引擎”。這?的內(nèi)部細(xì)節(jié),我們會在后續(xù)內(nèi)容中加以介紹。

// call protocol ops vector outstr(m*n); ProtocolManager::Instance()->GetProtocol()->GetOps(msg_id().str())->Matmul(in1, in2, outstr, &attrs_);

小結(jié)

在本篇?章中,我們進(jìn)?步介紹了 Rosetta 是如何深度適配、定制化改造 TensorFlow 的各個組件以引?隱私計算功能的。與其他隱私 AI 開源框架相?,Rosetta 由于需要同時對 TensorFlow 的前端和后端進(jìn)?擴展,并且完全復(fù)?對上層的 API 接?,所以定制化的程度更加深?。這?的改造是偏向于“系統(tǒng)易?性”這??標(biāo)的,不需要太多涉及 MPC 等隱私計算技術(shù)。

作者介紹

Rosetta 技術(shù)團隊,?群專注于技術(shù)、玩轉(zhuǎn)算法、追求?效的?程師。Rosetta 是?款基于主流深度學(xué)習(xí)框架 TensorFlow 的隱私 AI 框架,作為矩陣元公司?規(guī)模商業(yè)落地的重要引擎,它承載和結(jié)合了隱私計算、區(qū)塊鏈和 AI 三種典型技術(shù)。

?前 Rosetta 已經(jīng)在 Github 開源(https://github.com/LatticeX-Foundation/Rosettaf),歡迎關(guān)注并參與到 Rosetta 社區(qū)中來。

參考文獻(xiàn)

[1] Abadi,Martín,etal."Tensor?ow:A system for large-scale machine learning." 12th{USENIX}symposium on operat ing syst ems design and implement at ion({OSDI}16).2016.

[2] TensorFlow 對定制化 Op 擴展的?持:https://tensor?ow.google.cn/guide/create_op

責(zé)任編輯:xj

原文標(biāo)題:社區(qū)分享 | ?向隱私 AI 的 TensorFlow 深度定制化實踐

文章出處:【微信公眾號:TensorFlow】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

    關(guān)注

    0

    文章

    364

    瀏覽量

    40788
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    29815

    瀏覽量

    268109
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    328

    瀏覽量

    60474

原文標(biāo)題:社區(qū)分享 | ?向隱私 AI 的 TensorFlow 深度定制化實踐

文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    將DMA與C64x的框架組件結(jié)合使用

    電子發(fā)燒友網(wǎng)站提供《將DMA與C64x的框架組件結(jié)合使用.pdf》資料免費下載
    發(fā)表于 10-16 10:29 ?0次下載
    將DMA與C64x的框架<b class='flag-5'>組件</b><b class='flag-5'>結(jié)合</b>使用

    第四章:在 PC 交叉編譯 aarch64 的 tensorflow 開發(fā)環(huán)境并測試

    本文介紹了在 PC 端交叉編譯 aarch64 平臺的 tensorflow 庫而非 tensorflow lite 的心酸過程。
    的頭像 發(fā)表于 08-25 11:38 ?740次閱讀
    第四章:在 PC 交叉編譯 aarch64 的 <b class='flag-5'>tensorflow</b> 開發(fā)環(huán)境并測試

    通力發(fā)布最新定制電梯更新改造方案

    積極響應(yīng)"兩新"工作部署,助力城市高質(zhì)量發(fā)展 上海2024年8月6日 /美通社/ -- 作為全球電梯和自動扶梯行業(yè)的領(lǐng)導(dǎo)者之一,通力電梯今日宣布推出最新的定制電梯更新改造方案,旨在積極響應(yīng)并
    的頭像 發(fā)表于 08-06 08:30 ?230次閱讀

    TensorFlow是什么?TensorFlow怎么用?

    TensorFlow是由Google開發(fā)的一個開源深度學(xué)習(xí)框架,它允許開發(fā)者方便地構(gòu)建、訓(xùn)練和部署各種復(fù)雜的機器學(xué)習(xí)模型。TensorFlow憑借其高效的計算性能、靈活的架構(gòu)以及豐富的工具和庫,在學(xué)
    的頭像 發(fā)表于 07-12 16:38 ?535次閱讀

    前后端數(shù)據(jù)傳輸約定探討

    1 目的 穩(wěn)定可靠,降本增效 ? 前后端數(shù)據(jù)傳輸約定旨在提升系統(tǒng)穩(wěn)定性、可靠性,降低線上線下bug率;并提升研發(fā)效率、降低溝通成本、降低延期率。是確保項目前端和后端開發(fā)順利進(jìn)行的重要規(guī)約之一,定義了
    的頭像 發(fā)表于 07-08 19:10 ?191次閱讀
    <b class='flag-5'>前后端</b>數(shù)據(jù)傳輸約定探討

    tensorflow和pytorch哪個更簡單?

    工業(yè)界廣泛使用、具有豐富生態(tài)系統(tǒng)和跨平臺支持的框架,TensorFlow可能更適合您。以下是tensorflow和pytorch的介紹TensorFlow和PyTorch的基本概念
    的頭像 發(fā)表于 07-05 09:45 ?705次閱讀

    tensorflow和pytorch哪個好

    tensorflow和pytorch都是非常不錯的強大的框架,TensorFlow還是PyTorch哪個更好取決于您的具體需求,以下是關(guān)于這兩個框架的一些關(guān)鍵點: TensorFlow : 發(fā)布時間
    的頭像 發(fā)表于 07-05 09:42 ?603次閱讀

    tensorflow簡單的模型訓(xùn)練

    在本文中,我們將詳細(xì)介紹如何使用TensorFlow進(jìn)行簡單的模型訓(xùn)練。TensorFlow是一個開源的機器學(xué)習(xí)庫,廣泛用于各種機器學(xué)習(xí)任務(wù),包括圖像識別、自然語言處理等。我們將從安裝
    的頭像 發(fā)表于 07-05 09:38 ?472次閱讀

    keras模型轉(zhuǎn)tensorflow session

    在這篇文章中,我們將討論如何將Keras模型轉(zhuǎn)換為TensorFlow session。 Keras和TensorFlow簡介 Keras是一個高級神經(jīng)網(wǎng)絡(luò)API,它提供了一種簡單、快速的方式來構(gòu)建
    的頭像 發(fā)表于 07-05 09:36 ?437次閱讀

    如何使用Tensorflow保存或加載模型

    繼續(xù)訓(xùn)練也是必要的。本文將詳細(xì)介紹如何使用TensorFlow保存和加載模型,包括使用tf.keras和tf.saved_model兩種主要方法。
    的頭像 發(fā)表于 07-04 13:07 ?1169次閱讀

    英特爾聯(lián)手日企研發(fā)后端芯片自動制造技術(shù)

    隨著電路制造等前端技術(shù)逐漸逼近物理極限,后端步驟如芯片堆疊以提升性能的競爭愈發(fā)激烈。目前,后端生產(chǎn)主要依賴手工組裝,主要分布在勞動力資源豐富的地區(qū)如中國和東南亞。因此,英特爾視自動技術(shù)為在美國和日本設(shè)立工廠的關(guān)鍵要素。
    的頭像 發(fā)表于 05-07 09:42 ?407次閱讀

    鴻蒙OS開發(fā)實例:【組件模式】

    組件一直是移動端比較流行的開發(fā)方式,有著編譯運行快,業(yè)務(wù)邏輯分明,任務(wù)劃分清晰等優(yōu)點,針對Android端的組件;與Android端的組件
    的頭像 發(fā)表于 04-07 17:44 ?571次閱讀
    鴻蒙OS開發(fā)實例:【<b class='flag-5'>組件</b><b class='flag-5'>化</b>模式】

    模擬后端是什么意思

    模擬后端,在軟件開發(fā)和測試領(lǐng)域,通常是指使用工具或技術(shù)來模擬實際后端服務(wù)的行為。這樣做的主要目的是在項目開發(fā)過程中,當(dāng)后端服務(wù)還未就緒或暫時無法訪問時,前端或其他依賴后端的系統(tǒng)能夠繼續(xù)
    的頭像 發(fā)表于 03-15 15:58 ?609次閱讀

    詳解PyTorch在MPS后端的新特性

    大家好,我叫Kulinseth,我在蘋果的MPS團隊工作,今天我將討論PyTorch中MPS后端的改進(jìn)。接下來,我將介紹MPS后端進(jìn)入Beta Stage的新功能。我們添加了一些新功能,如支持分析器、自定義內(nèi)核和MPS開發(fā)者AP
    的頭像 發(fā)表于 12-15 10:57 ?2180次閱讀
    詳解PyTorch在MPS<b class='flag-5'>后端</b>的新特性

    springboot前后端交互流程

    Boot 進(jìn)行開發(fā)時,前后端交互是一個非常重要的部分,本文將詳細(xì)介紹 Spring Boot 前后端交互的流程。 前后端交互的基本原理 在前后端
    的頭像 發(fā)表于 11-22 16:00 ?1984次閱讀