亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        如何利用Python 為自然語(yǔ)言處理加速

        2019-09-10 07:22:44
        電腦報(bào) 2019年34期

        自去年發(fā)布 Python 的指代消解包(coreference resolution package)之后,很多用戶開(kāi)始用它來(lái)構(gòu)建許多應(yīng)用程序,而這些應(yīng)用與我們最初的對(duì)話應(yīng)用完全不同。我們發(fā)現(xiàn),盡管在處理對(duì)話時(shí)這個(gè)包的速度完全沒(méi)問(wèn)題,但在處理較大的問(wèn)題時(shí)卻非常慢。

        筆者決定調(diào)查一下這個(gè)問(wèn)題,于是就產(chǎn)生了 NeuralCoref v3.0(https://github.com/huggingface

        /neuralcoref/)這一項(xiàng)目,它比上一個(gè)版本快 100 倍(每秒能分析幾千個(gè)單詞),同時(shí)保持準(zhǔn)確度、易用性,并且依然在 Python 庫(kù)的生態(tài)系統(tǒng)中。

        在本文中筆者想分享一些在這個(gè)項(xiàng)目中學(xué)習(xí)到的經(jīng)驗(yàn),具體來(lái)說(shuō)包括:

        1.怎樣用 Python 設(shè)計(jì)高速的模塊;

        2.怎樣利用 spaCy 的內(nèi)部數(shù)據(jù)結(jié)構(gòu)來(lái)有效地設(shè)計(jì)高速的 NLP 函數(shù)。

        雖然我們是在討論 Python,但還要用一些 Cython的魔法。但別忘了,Cython 是 Python 的超集(http://cython.org/),所以別被它嚇住了!

        為 pyTorch 或 TensorFlow 等深度學(xué)習(xí)框架預(yù)處理一個(gè)大型數(shù)據(jù)集,或者在深度學(xué)習(xí)的批次加載器中有個(gè)很復(fù)雜的處理邏輯使得訓(xùn)練變慢。

        加速的第一步:性能分析

        首先要明確一點(diǎn),絕大部分純 Python 的代碼是沒(méi)有問(wèn)題的,但有幾個(gè)瓶頸函數(shù)如果能夠解決,就能給速度帶來(lái)數(shù)量級(jí)上的提升。

        因此首先應(yīng)該用分析工具分析 Python 代碼,找出哪里慢。一個(gè)辦法是使用cProfile(https://docs.python.org/3/library/profile.html):

        import cProfile

        import pstats

        import my_slow_module

        cProfile.run(‘my_slow_module.run()’, ‘restats’)

        p = pstats.Stats(‘restats’)

        p.sort_stats(‘cumulative’).print_stats(30)

        也許你會(huì)發(fā)現(xiàn)有幾個(gè)循環(huán)比較慢,如果用神經(jīng)網(wǎng)絡(luò)的話,可能有幾個(gè) NumPy 數(shù)組操作會(huì)很慢(但這里我不會(huì)討論如何加速 NumPy,那么,應(yīng)該如何加快循環(huán)的速度?

        利用 Cython 實(shí)現(xiàn)更快的循環(huán)

        用個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明。假設(shè)我們一個(gè)巨大的集合里包含許多長(zhǎng)方形,保存為 Python 對(duì)象(即 Rectangle 類(lèi)的實(shí)例)的列表。模塊的主要功能就是遍歷該列表,數(shù)出有多少個(gè)長(zhǎng)方形超過(guò)了某個(gè)閾值。

        我們的 Python 模塊非常簡(jiǎn)單,如下所示:

        from random import random

        class Rectangle:

        def __init__(self, w, h):

        self.w = w

        self.h = h

        def area(self):

        return self.w * self.h

        def check_rectangles(rectangles, threshold):

        n_out = 0

        for rectangle in rectangles:

        if rectangle.area() > threshold:

        n_out += 1

        return n_out

        def main():

        n_rectangles = 10000000

        rectangles = list(Rectangle(random(), random()) for i in range(n_rectangles))

        n_out = check_rectangles(rectangles, threshold=0.25)

        print(n_out)

        這里 check_rectangles 函數(shù)就是瓶頸!它要遍歷大量 Python 對(duì)象,而由于每次循環(huán)中 Python 解釋器都要在背后進(jìn)行許多工作(如在類(lèi)中查找 area 方法、打包解包參數(shù)、調(diào)用 Python API 等),這段代碼就會(huì)非常慢。

        Cython 能幫我們加快循環(huán)

        Cython 語(yǔ)言是 Python 的一個(gè)超集,它包含兩類(lèi)對(duì)象:

        1.Python 對(duì)象是在正常的 Python 中操作的對(duì)象,如數(shù)字、字符串、列表、類(lèi)實(shí)例等。

        2.Cython C 對(duì)象是 C 或 C++ 對(duì)象,如 dobule、int、float、struct、vectors,這些可以被 Cython 編譯成超級(jí)快的底層代碼。

        高速循環(huán)就是 Cython 程序中只訪問(wèn) Cython C 對(duì)象的循環(huán)。

        設(shè)計(jì)這種高速循環(huán)最直接的辦法就是,定義一個(gè) C 結(jié)構(gòu),它包含計(jì)算過(guò)程需要的一切。在這個(gè)例子中,該結(jié)構(gòu)需要包含長(zhǎng)方形的長(zhǎng)和寬。

        然后我們就可以將長(zhǎng)方形列表保存在一個(gè) C 數(shù)組中,傳遞給 check_rectangles 函數(shù)。現(xiàn)在該函數(shù)就需要接收一個(gè) C 數(shù)組作為輸入,因此它應(yīng)該用 cdef 關(guān)鍵字(而不是 def)定義為 Cython 函數(shù)。(注意 cdef 也被用來(lái)定義 Cython C 對(duì)象。)

        試一下這段代碼

        有許多方法可以測(cè)試、編譯并發(fā)布 Cython 代碼!Cython 甚至可以像 Python 一樣直接用在 Jupyter Notebook 中,首先用 pip install cython 安裝 Cython:

        編寫(xiě)、使用并發(fā)布 Cython 代碼

        Cython 代碼保存在 .pyx 文件中。這些文件會(huì)被 Cython 編譯器編譯成 C 或 C++ 文件,然后再被系統(tǒng)的 C 編譯器編譯成字節(jié)碼。這些字節(jié)碼可以直接被 Python 解釋器使用。

        可以在 Python 中使用 pyximport 直接加載 .pyx 文件:

        >>> import pyximport; pyximport.install()

        >>> import my_cython_module

        也可以將Cython代碼構(gòu)建成Python包,并作為正常的Python包導(dǎo)入或發(fā)布。這項(xiàng)工作比較花費(fèi)時(shí)間,主要是要處理所有平臺(tái)上的兼容性問(wèn)題。在進(jìn)入 NLP 之前,我們先快速討論下 def、cdef 和 cpdef 關(guān)鍵字,這些是學(xué)習(xí) Cython 時(shí)最關(guān)鍵的概念。

        通過(guò) spaCy 使用 Cython 加速 NLP

        前面說(shuō)的這些都很好……但這跟 NLP 還沒(méi)關(guān)系呢!沒(méi)有字符串操作,沒(méi)有 Unicode 編碼,自然語(yǔ)言處理中的難點(diǎn)都沒(méi)有支持?。《?Cython 的官方文檔甚至還反對(duì)使用 C 語(yǔ)言級(jí)別的字符串。一般來(lái)說(shuō),除非你知道你在做什么,否則盡量不要使用 C 字符串,而應(yīng)該使用 Python 字符串對(duì)象,這就輪到 spaCy 出場(chǎng)了,spaCy 解決這個(gè)問(wèn)題的辦法特別聰明。

        將所有字符串轉(zhuǎn)換成 64 比特 hash

        在 spaCy 中,所有 Unicode 字符串(token 的文本,token 的小寫(xiě)形式,lemma 形式,詞性標(biāo)注,依存關(guān)系樹(shù)的標(biāo)簽,命名實(shí)體標(biāo)簽……)都保存在名為 StringStore 的單一數(shù)據(jù)結(jié)構(gòu)中,字符串的索引是 64 比特 hash,也就是 C 語(yǔ)言層次上的 unit64_t。

        StringStore 對(duì)象實(shí)現(xiàn)了在 Python unicode 字符串和 64 比特 hash 之間的查找操作。StringStore 可以從 spaCy 中的任何地方、任何對(duì)象中訪問(wèn),例如可以通過(guò) nlp.vocab.string、doc.vocab.strings 或 span.doc.vocab.string 等。當(dāng)模塊需要在某些 token 上進(jìn)行快速處理時(shí),它只會(huì)使用 C 語(yǔ)言層次上的 64 比特 hash,而不是使用原始字符串。調(diào)用 StringStore 的查找表就會(huì)返回與該 hash 關(guān)聯(lián)的 Python unicode 字符串。但是 spaCy 還做了更多的事情,我們可以通過(guò)它訪問(wèn)完整的 C 語(yǔ)言層次上的文檔和詞匯表結(jié)構(gòu),因此可以使用 Cython 循環(huán),不需要再自己構(gòu)建數(shù)據(jù)結(jié)構(gòu)。

        手机在线免费av资源网| 精品国产性色av网站| 久久迷青品着产亚洲av网站| 午夜理论片日本中文在线 | 乱人伦中文字幕成人网站在线| 精品在免费线中文字幕久久| 国产精品又污又爽又色的网站| 国产欧美精品aaaaaa片| 成片免费观看视频大全| 无遮挡十八禁在线视频国产制服网站| 国产av一区二区三区在线 | 亚洲av无码专区在线观看下载| 国产精品卡一卡二卡三| 亚洲人成网站18男男| 日韩精品中文字幕第二页| 朝鲜女人大白屁股ass孕交| 婷婷成人基地| 亚洲av永久青草无码精品| 蜜桃视频羞羞在线观看| 色欲人妻综合aaaaa网| 亚洲在AV极品无码天堂手机版| 蜜桃视频免费在线视频| 黄片视频大全在线免费播放| 国产农村妇女精品一二区 | 亚洲精品乱码久久久久久按摩高清 | 午夜无码片在线观看影院| 久久国产精品岛国搬运工| 亚洲乱码一区二区av高潮偷拍的| 亚洲国产精品一区二区www| 麻豆精品一区二区三区| 亚洲女同免费在线观看| 久久亚洲av午夜福利精品一区| 国产色诱视频在线观看| 国产精品爽爽VA吃奶在线观看| 第一九区另类中文字幕| 亚洲av永久无码精品三区在线| 在线欧美不卡| 人妻少妇中文字幕av| 97一期涩涩97片久久久久久久| 久久国产精久久精产国| 最新福利姬在线视频国产观看|