顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章

星期一, 10月 30, 2023

Python 土炮 port scanner

 本座想在 VPS 上架服務,但是又怕防火牆擋著連不到,就從 Stack overflow上的答案改了個土炮 port scanner,可應用於快速檢測哪些 outbound port 有開。本座主要修改為設定 thread 的數目上限避免執行環境出錯無法 create thread。小工具速度一般,但也夠用了,而且乾淨、方便。 

# This script runs on Python 3
import socket, threading


def TCP_connect(ip, port_number, delay, output):
    TCPsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    TCPsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    TCPsock.settimeout(delay)
    try:
        TCPsock.connect((ip, port_number))
        output[port_number] = 'Listening'
    except:
        output[port_number] = ''



def scan_ports(host_ip, delay):

    threads = []        # To run TCP_connect concurrently
    output = {}         # For printing purposes

    num_thread = 64
    
    for port_range in range(0,10000,num_thread):
        # Spawning threads to scan ports
        threads = []
        for i in range(num_thread):
            t = threading.Thread(target=TCP_connect, args=(host_ip, port_range+i, delay, output))
            threads.append(t)

        # Starting threads
        for i in range(num_thread):
            threads[i].start()

        # Locking the main thread until all threads complete
        for i in range(num_thread):
            threads[i].join()

        # Printing listening ports from small to large
        for i in range(num_thread):
            if output[port_range+i] == 'Listening':
                print(str(port_range+i) + ': ' + output[port_range+i])



def main():
    host_ip = input("Enter host IP: ")
    delay = int(input("How many seconds the socket is going to wait until timeout: "))   
    scan_ports(host_ip, delay)

if __name__ == "__main__":
    main()
全文連結

星期四, 8月 10, 2023

Python-docx 試用

處理報告又遇到麻煩。某個篩檢業務,除了完成電腦報告之外,每份報告還要手寫給病人看的通知書,增加很多工作量。

還好遇到殊勝的 python-docx套件,可以直接對Word檔進行search還有replaceStack overflow 上也有可以進行修改使用的範例。確認可行後,找了同仁,要了通知書原始電腦範本docxtemplate。弄個前端 HTML form + AHK + 從其他表單帶數字,command line 丟到 Python對模板寫資料,通知書產生器就完成了。我減少工作量,病人不用忍受難看的手寫字。這週處理 paper work減少工作量就感覺到成就感 XD

全文連結

星期六, 8月 05, 2023

TinyBERT和ONNX runtime使用心得

BERT的CPU inference 性能真是悲劇。之前做研究發現用 fine-tuned BERT在報告匯入 Elasticsearch 前preprocessing,可解決否定語句(No evidence of XXX)干擾搜尋結果的問題。研究時 BERT 很好用,準確度很高。但佈署到生產環境才發現有嚴重性能問題。

訓練時,雲端GPU租賃有RTX 3090、4090吃到飽。訓練樣本量(幾千份)很小,沒發現問題。做staging(no CUDA)和推到生產環境(Intel Core I3-9100,Intel 內顯)問題就來了。

在 staging 機器上,加了DistilBERT模型做 preprocessing 之後,文本索引速度暴跌到一小時幾千份。而目前要索引的報告量接近800萬份。生產環境基本不能用。

後來找網路攻略。發現三個解決思路:換輕量化模型、換Runtime、模型瘦身(做 INT8 quantization或pruning等,「據說」對CPU架構會友善點)。

輕量化模型找到了:華為的 TinyBERT。原始論文號稱推理速度比BERT快接近10倍。實際把DistilBERT換成TinyBERT後,索引速度在staging和生產環境就暴增到一小時2萬份,F1 score (0.94)和原本用DistilBERT差不多。但雖然性能有很大提升,一次完整索引迭代還是要超過2個禮拜。做到一半發現有問題需要重新索引又是另一個迭代。

後來繼續查,照著網路攻略把INT8 quantization弄了出來,但staging的時候跟我說沒GPU不能開quantization!功力不夠找不到問題就先放棄了。再試了換Runtime。Runtime換到ONNX以後。Jupyter notebook上推理的 wall time 直接變1/3(68000+ 測資 14min -> 5min)。於是再熱火朝天改code佈署。結果性能提升比三倍更多(原因不清楚,權當神秘學XD),索引速度爆增到每小時15萬份,一次索引迭代只要兩三天。已可接受了。

結論而言。如果未來服務要更進一步,還是要想辦法搞 GPU。用CPU跑BERT根本自虐,還好這次有找到解法,不然就得關feature然後說研究成果落地有困難QQ

全文連結

星期日, 11月 06, 2022

Jupyter notebook module 找不到除錯

參考文章連結 

今天玩 python NLP 遇到鬼打牆現象:明明已經 !pip install spacy 但 jupyter 執行 import spacy 一直說 module not found。 排查後才發現是 jupyter kernel 的問題。我 docker container 原本就自帶 python 3.7,apt-get install 又自己裝了一套 python 3.9 並只認自帶的版本,兩者各自獨立,前者裝的 package 後者找不到。 

後來 Dockerfile 做了些設定

apt-get install jupyter-client
pip install ipykernel
python -m ipykernel install --user

其中裝 jupyter-client 是為了能執行 jupyter kernelspec list。後兩者則是讓 jupyter 認我裝的 python 而非 jupyter 自帶的。Dockerfile 改好後 rebuild 問題解決。

全文連結

星期四, 7月 07, 2022

Python future 安裝 No module named 'src' 解法

安裝 Pyinstaller 時會自動安裝依賴包 future,然後就遇到這問題,從連結找到解法。 手動去 github 抓包,解壓縮,setup.py 中 import src 之前加入一行 statement 即可:
sys.path.append('')
其實 sys.path.append('.') 也可以。看來是 path 的問題。弄好後 python setup.py install 問題解決!
全文連結