日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

還能這樣?把 Python 自動翻譯成 C++

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-10 18:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文主要介紹在機器學習模型部署過程中,怎么樣快速得將python轉(zhuǎn)為C++
來源:騰訊技術(shù)工程微信號
作者:byronhe,騰訊 WXG 開發(fā)工程師

一、問題背景

隨著深度學習的廣泛應(yīng)用,在搜索引擎/推薦系統(tǒng)/機器視覺等業(yè)務(wù)系統(tǒng)中,越來越多的深度學習模型部署到線上服務(wù)。

機器學習模型在離線訓練時,一般要將輸入的數(shù)據(jù)做特征工程預處理,再輸入模型在 TensorFlow PyTorch 等框架上做訓練。

1.常見的特征工程邏輯

常見的特征工程邏輯有:

分箱/分桶 離散化

log/exp 對數(shù)/冪等 math numpy 常見數(shù)學運算

特征縮放/歸一化/截斷

交叉特征生成

分詞匹配程度計算

字符串分隔匹配判斷 tong

缺省值填充等

數(shù)據(jù)平滑

onehot 編碼,hash 編碼等

這些特征工程代碼,當然一般使用深度學習最主要的語言 python 實現(xiàn)。

二、業(yè)務(wù)痛點

離線訓練完成,模型上線部署后,同樣要用 C++ 重新實現(xiàn) 這些 python 的特征工程邏輯代碼。

我們發(fā)現(xiàn),“用 C++ 重新實現(xiàn)” 這個步驟,給實際業(yè)務(wù)帶來了大量的問題:

繁瑣,費時費力,極容易出現(xiàn) python 和 C++ 代碼不一致

不一致會直接影響模型在線上的效果,導致大盤業(yè)務(wù)指標不如預期,產(chǎn)生各種 bad case

不一致難以發(fā)現(xiàn),無法測試,無法監(jiān)控,經(jīng)常要靠用戶投訴反饋,甚至大盤數(shù)據(jù)異常才能發(fā)現(xiàn)

1. 業(yè)界方案

針對這些問題,我調(diào)研了這些業(yè)界方案:

《推薦系統(tǒng)中模型訓練及使用流程的標準化》

《自主研發(fā)、不斷總結(jié)經(jīng)驗,美團搜索推薦機器學習平臺》

《京東電商推薦系統(tǒng)實踐》

“模型線上線下一致性問題對于模型效果非常重要,我們使用特征日志來實時記錄特征,保證特征的一致性。這樣離線處理的時候會把實時的用戶反饋,和特征日志做一個結(jié)合生成訓練樣本,然后更新到模型訓練平臺上,平臺更新之后在推送到線上,這樣整個排序形成了一個閉環(huán)?!?/p>

總結(jié)起來,有幾種思路:

在線特征存儲起來給離線用

在線 C++ 代碼編譯成 so 導出給離線用

根據(jù)一份配置生成離線和在線代碼

提取公共代碼,加強代碼復用,等軟件工程手段,減少不一致

2. 自動翻譯方案

(1) .已有方案的缺點

但這些思路都有各種缺點:

所有在線請求的所有特征,這個存儲量數(shù)據(jù)量很大

算法改代碼需要等待后臺開發(fā),降低了算法同學的工作效率

特征處理代碼的復雜度轉(zhuǎn)移到配置文件中,不一定能充分表達,而且配置格式增加學習成本

就這邊真實離線特征處理代碼來看,大部分代碼都無法抽取出公共代碼做復用。

(2). 翻譯器

回到問題出發(fā)點考慮,顯而易見,這個問題歸根結(jié)底就是需要一個 “ python 到 c++ 的翻譯器 ” 。

那其實 “翻譯器 Transpiler ” ,和編譯器解釋器類似,也是個古老的熱門話題了,比如 WebAssembly, CoffeeScript ,Babel ,
Google Closure Compiler,f2c

于是一番搜索,發(fā)現(xiàn) python 到 C++ 的翻譯器也不少,其中 Pythran 是新興比較熱門的開源項目。

于是一番嘗試后,借助 pythran,我們實現(xiàn)了:

一條命令 全自動把 Python 翻譯成等價 C++

嚴格等價保證改寫,徹底消除不一致

完全去掉重新實現(xiàn) 這塊工作量,后臺開發(fā)成本降到 0 ,徹底解放生產(chǎn)力

算法同學繼續(xù)使用純 python,開發(fā)效率無影響, 無學習成本

并能推廣到其他需要 python 改寫成后臺 C++ 代碼 的業(yè)務(wù)場景,解放生產(chǎn)力

三、pythran 的使用流程

(1). 安裝

一條命令安裝:

pip3 install pythran

(2). 寫 Python 代碼

下面這個 python demo,是 pythran 官方 demo

import math
import numpy as np

def zero(n, m):
    return [[0]*n for col in range(m)]

#pythran export matrix_multiply(float list list, float list list)
def matrix_multiply(m0, m1):
    new_matrix = zero(len(m0),len(m1[0]))
    for i in range(len(m0)):
        for j in range(len(m1[0])):
            for k in range(len(m1)):
                new_matrix[i][j] += m0[i][k]*m1[k][j]
    return new_matrix

#pythran export arc_distance(float[], float[], float[], float[])
def arc_distance(theta_1, phi_1, theta_2, phi_2):
    """
    Calculates the pairwise arc distance
    between all points in vector a and b.
    """
    temp = (np.sin((theta_2-theta_1)/2)**2
           + np.cos(theta_1)*np.cos(theta_2) * np.sin((phi_2-phi_1)/2)**2)
    distance_matrix = 2 * np.arctan2(np.sqrt(temp), np.sqrt(1-temp))
    return distance_matrix


#pythran export dprod(int list, int list)
def dprod(l0,l1):
    """WoW, generator expression, zip and sum."""
    return sum(x * y for x, y in zip(l0, l1))


#pythran export get_age(int )
def get_age(age):
    if age <= 20:
        age_x = '0_20'
    elif age <= 25:
        age_x = '21_25'
    elif age <= 30:
        age_x = '26_30'
    elif age <= 35:
        age_x = '31_35'
    elif age <= 40:
        age_x = '36_40'
    elif age <= 45:
        age_x = '41_45'
    elif age <= 50:
        age_x = '46_50'
    else:
        age_x = '50+'
    return age_x

(3). Python 轉(zhuǎn)成 C++

一條命令完成翻譯

pythran -e demo.py -o  demo.hpp

(4). 寫 C++ 代碼調(diào)用

pythran/pythonic/ 目錄下是 python 標準庫的 C++ 等價實現(xiàn),翻譯出來的 C++ 代碼需要 include 這些頭文件

寫個 C++ 代碼調(diào)用

#include "demo.hpp"
#include "pythonic/numpy/random/rand.hpp"
#include 

using std::cout;
using std::endl;

int main() {
  pythonic::types::list> m0 = {{2.0, 3.0},
                                                             {4.0, 5.0}},
                                                       m1 = {{1.0, 2.0},
                                                             {3.0, 4.0}};
  cout << m0 << "*" << m1 << "/n=/n"
       << __pythran_demo::matrix_multiply()(m0, m1) << endl
       << endl;

  auto theta_1 = pythonic::numpy::random::rand(3),
       phi_1 = pythonic::numpy::random::rand(3),
       theta_2 = pythonic::numpy::random::rand(3),
       phi_2 = pythonic::numpy::random::rand(3);
  cout << "arc_distance " << theta_1 << "," << phi_1 << "," << theta_2 << ","
       << phi_2 << "/n=/n"
       << __pythran_demo::arc_distance()(theta_1, phi_1, theta_2, phi_2) << endl
       << endl;

  pythonic::types::list l0 = {2, 3}, l1 = {4, 5};
  cout << "dprod " << l0 << "," << l1 << "/n=/n"
       << __pythran_demo::dprod()(l0, l1) << endl
       << endl;

  cout << "get_age 30 = " << __pythran_demo::get_age()(30) << endl << endl;

  return 0;
}

(5). 編譯運行

g++ -g -std=c++11 main.cpp -fopenmp -march=native -DUSE_XSIMD -I /usr/local/lib/python3.6/site-packages/pythran/ -o pythran_demo


./pythran_demo

四、pythran 的功能與特性

(1). 介紹

按官方定義,Pythran 是一個 AOT (Ahead-Of-Time - 預先編譯) 編譯器。給科學計算的 python 加注解后,pythran 可以把 python 代碼變成接口相同的原生 python 模塊,大幅度提升性能。

并且 pythran 也可以利用 OpenMP 多核和 SIMD 指令集。

支持 python 3 和 Python 2.7 。

pythran 的 manual 挺詳細:
https://pythran.readthedocs.io/en/latest/MANUAL.html

(2). 功能

pythran 并不支持完整的 python, 只支持 python 語言特性的一個子集:

polymorphic functions 多態(tài)函數(shù)(翻譯成 C++ 的泛型模板函數(shù))

lambda

list comprehension 列表推導式

map, reduce 等函數(shù)

dictionary, set, list 等數(shù)據(jù)結(jié)構(gòu)

exceptions 異常

file handling 文件處理

部分 numpy

不支持的功能:

classes 類

polymorphic variables 可變類型變量

(3). 支持的數(shù)據(jù)類型和函數(shù)

pythran export 可以導出函數(shù)和全局變量。
支持導出的數(shù)據(jù)類型,BNF 定義是:

  argument_type = basic_type
                  | (argument_type+)    # this is a tuple
                  | argument_type list    # this is a list
                  | argument_type set    # this is a set
                  | argument_type []+    # this is a ndarray, C-style
                  | argument_type [::]+    # this is a strided ndarray
                  | argument_type [:,...,:]+ # this is a ndarray, Cython style
                  | argument_type [:,...,3]+ # this is a ndarray, some dimension fixed
                  | argument_type:argument_type dict    # this is a dictionary

    basic_type = bool | byte | int | float | str | None | slice
               | uint8 | uint16 | uint32 | uint64 | uintp
               | int8 | int16 | int32 | int64 | intp
               | float32 | float64 | float128
               | complex64 | complex128 | complex256

可以看到基礎(chǔ)類型相當全面,支持各種 整數(shù),浮點數(shù),字符串,復數(shù)

復合類型支持 tuple, list, set, dict, numpy.ndarray 等,

對應(yīng) C++ 代碼的類型實現(xiàn)在 pythran/pythonic/include/types/ 下面,可以看到比如 dict 實際就是封裝了一下 std::unordered_map
https://pythran.readthedocs.i...
可以看到支持的 python 基礎(chǔ)庫,其中常用于機器學習的 numpy 支持算比較完善。

五、pythran 的基本原理

和常見的編譯器/解釋器類似, pythran 的架構(gòu)是分成 3 層:

python 代碼解析成抽象語法樹 AST 。用 python 標準庫自帶的的 ast 模塊實現(xiàn)

代碼優(yōu)化。

在 AST 上做優(yōu)化,有多種 transformation pass,比如 deadcode_elimination 死代碼消除,loop_full_unrolling 循環(huán)展開 等。還有 Function/Module/Node 級別的 Analysis,用來遍歷 AST 供 transformation 利用。

后端,實現(xiàn)代碼生成。目前有 2 個后端,Cxx / Python, Cxx 后端可以把 AST 轉(zhuǎn)成 C++ 代碼( Python 后端用來調(diào)試)。

目前看起來 ,pythran 還欠缺的:

字符串處理能力欠缺,缺少 str.encode()/str.decode() 對 utf8 的支持

缺少正則表達式 regex 支持

看文檔要自己加也不麻煩,看業(yè)務(wù)需要可以加。

審核編輯 黃昊宇

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

    關(guān)注

    1821

    文章

    50367

    瀏覽量

    267075
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2131

    瀏覽量

    77424
  • 機器學習
    +關(guān)注

    關(guān)注

    67

    文章

    8567

    瀏覽量

    137264
  • python
    +關(guān)注

    關(guān)注

    58

    文章

    4889

    瀏覽量

    90332
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    手搓C++離散小波變換DWT程序

    關(guān)于小波變換,我們當然可以選擇速度更快地方式來使用它。和python相比,C++編譯后的代碼在對同一組參數(shù)配置并且處理同一組數(shù)據(jù),在沒有優(yōu)化的情況下,處理速度可以快達10倍上,均不包括結(jié)果寫入csv文件步驟的時間。下圖中的19
    的頭像 發(fā)表于 04-22 14:15 ?99次閱讀
    手搓<b class='flag-5'>C++</b>離散小波變換DWT程序

    C++與lua聯(lián)合編程

    之間進行低成本、高安全“貿(mào)易”的絕對定價權(quán)。 一、 消除“翻譯摩擦”,將跨邊界通信成本降至極限 在跨國貿(mào)易中,海關(guān)的通關(guān)效率直接決定了商品的流通成本。在混合編程中,C++ 與 Lua 擁有各自獨立
    發(fā)表于 04-19 16:27

    C++:const 的空間,常量也能占內(nèi)存?

    ] != BLACK)): return True return False c++語言5g.FsW.dgdfgsg.cnJIWWQc++語言 c++語言5g.I5y.dgdfgsg.cnJIWWQc++
    發(fā)表于 04-16 19:19

    C語言與C++的區(qū)別及聯(lián)系

    是面向過程語言,而C++是面向?qū)ο笳Z言。說CC++的區(qū)別,也就是在比較面向過程和面向?qū)ο蟮膮^(qū)別。 1、面向過程和面向?qū)ο蟮膮^(qū)別 面向過程:面向過程編程就是分析出解決問題的步驟,然后
    發(fā)表于 12-24 07:23

    紡織廠工業(yè)靈魂溝通指南:如何ETHERNET/IP的英語翻譯成CC-LINK的日語

    紡織廠工業(yè)靈魂溝通指南:如何ETHERNET/IP的英語翻譯成CC-LINK的日語 一、產(chǎn)品特性與項目背景 在紡織服裝生產(chǎn)車間,設(shè)備往往來自不同供應(yīng)商,導致自動化系統(tǒng)協(xié)議雜亂。某大型紡織企業(yè)原有羅
    的頭像 發(fā)表于 12-12 15:01 ?500次閱讀
    紡織廠工業(yè)靈魂溝通指南:如何<b class='flag-5'>把</b>ETHERNET/IP的英語<b class='flag-5'>翻譯成</b>CC-LINK的日語

    CC++之間的聯(lián)系

    且不需要高級特性的場景,而C++則在提供高效性能的同時,還能借助面向?qū)ο蠛头盒途幊痰忍匦蕴岣哕浖目删S護性和可擴展性
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο缶幊?(OOP): C語言是一種面向過程的語言,它強調(diào)的是通過函數(shù)將任務(wù)分解為一系列步驟進行執(zhí)行。 C++C語言的基礎(chǔ)上擴展了面向?qū)ο蟮奶匦?,支持?class)、封裝、繼承
    發(fā)表于 12-11 06:23

    嵌入式C/C++回歸測試四大最佳實踐(附自動化測試工具TESSY使用教程)

    嵌入式開發(fā)中,一次微小的代碼改動都可能引發(fā)“蝴蝶效應(yīng)”,如何守護系統(tǒng)的穩(wěn)?。客扑]專業(yè)的自動化測試工具#TESSY,源自戴姆勒-奔馳,是嵌入式C/C++單元/集成測試的標桿。
    的頭像 發(fā)表于 10-31 14:21 ?599次閱讀
    嵌入式<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>回歸測試四大最佳實踐(附<b class='flag-5'>自動</b>化測試工具TESSY使用教程)

    技能+1!如何在樹莓派上使用C++控制GPIO?

    在使用樹莓派時,你會發(fā)現(xiàn)Python和Scratch是許多任務(wù)(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發(fā)表于 08-06 15:33 ?4528次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    Gerber變成電磁波:推薦一款基于Gerber的openEMS仿真工具 - gerber2ems

    “Gerber + 鉆孔+ 疊層”一鍵翻譯成 openEMS 能吃的 3D 模型,跑完還能跟 VNA 實測對波。
    的頭像 發(fā)表于 08-03 11:21 ?4520次閱讀
    <b class='flag-5'>把</b>Gerber變成電磁波:推薦一款基于Gerber的openEMS仿真工具 - gerber2ems

    C++Python:樹莓派上哪種語言更優(yōu)?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富的庫和資源而被
    的頭像 發(fā)表于 07-24 15:32 ?1139次閱讀
    <b class='flag-5'>C++</b> 與 <b class='flag-5'>Python</b>:樹莓派上哪種語言更優(yōu)?

    AI耳機變身翻譯官+會議總結(jié)大師?涂鴉AI音頻開發(fā)方案,讓耳機升級到下一個level

    在接入AI能力后,耳機這種日?;漠a(chǎn)品,能有多大的想象空間?它不僅能幫你輕松聽懂全球外語和地方方言,還能將語音轉(zhuǎn)化為文字、翻譯成不同語言,甚至自動總結(jié)會議要點、生成思維導圖,適配辦公、學習、跨語言
    的頭像 發(fā)表于 07-10 18:47 ?2295次閱讀
    AI耳機變身<b class='flag-5'>翻譯</b>官+會議總結(jié)大師?涂鴉AI音頻開發(fā)方案,讓耳機升級到下一個level

    水表界的“翻譯官”:讓CCLinkIE和Modbus TCP“無障礙聊天”!

    ”,接收控制指令;轉(zhuǎn)身又在Modbus TCP網(wǎng)絡(luò)中當“指揮主站”,指令翻譯成水表能懂的格式。核心秘訣是地址映射:通過配置工具,將PLC的軟元件地址(如D1000)與水表的Modbus寄存器地址(如
    發(fā)表于 07-10 15:43

    CCLINKIE轉(zhuǎn)PROFINET:電機的“網(wǎng)絡(luò)沖浪神器”!

    咋整? 別急別急,這時候耐達訊CCLINKIE轉(zhuǎn)PROFINET網(wǎng)關(guān)就閃亮登場啦!它就像一個超級“翻譯官”,能把CCLINKIE的“方言”翻譯成PROFINET能聽懂的“普通話”,讓電機輕松融入
    發(fā)表于 05-28 15:21

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?

    在單片機的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說內(nèi)存這道坎兒。您當stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?1230次閱讀
    主流的 MCU 開發(fā)語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?
    福鼎市| 拉孜县| 青铜峡市| 沙湾县| 邯郸县| 齐齐哈尔市| 铁岭市| 平乐县| 扶余县| 高雄市| 渭南市| 浏阳市| 香格里拉县| 上杭县| 赤峰市| 诏安县| 武夷山市| 克什克腾旗| 海淀区| 右玉县| 肇州县| 九龙坡区| 晴隆县| 栾城县| 丹棱县| 石门县| 洛浦县| 宁波市| 竹山县| 尚志市| 阿坝| 石屏县| 福建省| 康马县| 纳雍县| 马尔康县| 蒙阴县| 周口市| 正蓝旗| 黎城县| 平利县|