一個Python軟件包,可將功能調用卸載到在Localhost上運行的HTTP服務器,自動使用裝飾器。與多處理,泡菜,燒瓶,fastapi,異步等兼容。
想像一下一個多螺紋或多處理應用程序的情況,其中1個或幾個功能是大量資源(CPU或內存)密集的,但是其他功能可以並行運行。
示例-API調用,然後使用大型DL模型進行令牌化和分類,然後再進行進一步的API調用。
在這種情況下,創建服務器(通常使用Torchserve或tfserving)以服務請求並用對服務器的發布請求替換功能調用是有意義的。
ServerHandler創建同步服務器,並在運行時自動替換對函數的任何調用。
向運行http.server.httpserver的過程的1個實例提出了請求,該過程在其中運行該功能。
也可以使用AsyncServerHandler,從而使請求異步。
即使是由不同的過程,線程,多處理,燒瓶,FastAPI和異步事件循環進行的調用,也可以在同一服務器過程中進行。
一般來說 :
some code with a callable
可以用ServerHandler或AsyncServerHandler的實例替換,該實例將代碼作為字符串作為第一個參數中的字符串以及可callable的名稱作為第二個參數。
from auto_function_serving . ServerHandler import ServerHandler
callable_name = ServerHandler ( """
some independent code with a callable
""" , "callable_name" )例子 :
import module1
import module2
def functionname ( someinput ):
a = module1 . function1 ( someinput )
return module2 . function2 ( a )可以替換
from auto_function_serving . ServerHandler import AsyncserverHandler
functionname = AsyncServerHandler ( """
import module1
import module2
def functionname(someinput):
a = module1.function1(someinput)
return module2.function2(a)
""" , "functionname" , port = "Any" )裝飾器( @asyncserverhandler.decorator和 @serverhandler.decorator)和asyncserverhandler詳細信息。
from auto_function_serving . ServerHandler import ServerHandler
callable_name = ServerHandler ( """
some independent code with a callable
""" , "callable_name" , port = None , backend = 'Popen' , wait = 100 , backlog = 1024 ))運行http.server.httpserver。
ServerHandler和AsyncServerHandler對象可以加載並用泡菜卸載。
使用Popen或多處理來運行服務器。
僅使用單個外部依賴項(AIOHTTP),僅用於異步。
http,而不是https。
根據輸入哈希選擇端口。 (除非另有說明)
最小代碼更改。
幾乎所有Cpython Envs中的功能幾乎都應兼容。 (不確定在哪裡可能失敗?如果您找到問題,請添加一個問題。)
內存洩漏或錯誤(來自服務器)極不可能,因為它是最小的,單線的,單個過程和Python STDLIB的默認組件。
異常導致5xx錯誤而無需關閉服務器。
除非另有說明,否則即使是單獨的進程也會向同一服務器的1個實例提出請求。 (因為它在特定端口上尋找服務器。)。
可以通過將端口設置為任何自由端口,以便將新的ServerHandler對象啟動新服務器來指定。
HTTP帖子請求:輕巧,幾乎沒有MS開銷,可靠。
異步是一個很好的功能。
現在有測試。
除非使用裝飾符,否則將代碼作為參數的代碼不是Pythonic。
即使使用了裝飾器,進口內部功能也不是理想的選擇。
HTTP帖子請求:不安全,幾乎沒有MS開銷。
服務器內部的例外未發送。
沒有批處理。
沒有內置的記錄。 (可以添加)。初始化延遲最多幾秒鐘以啟動服務器。異步函數在服務器上不起作用。
如果服務器關閉,則無自動服務器重新啟動。
如果不正確關閉,可能會使一些鎖定的資源鎖定一段時間(<1分鐘)。
如果不可用或多處理,可能會出現問題。
可能與Jupyter嵌套異步錯誤?請研究Nest-Asyncio和問題。
有些駭人聽聞(但合法且功能齊全)解決的警告。
由於某種原因(測試和不太可能),在DEL和ATEXIT.REDISTER( DEL )中關閉服務器進程。
使用軟件包管理器pip安裝auto_function_serving
pip install auto_function_serving服務器的代碼存儲在serverhandler.base_code中,並使用一些字符串格式來填充空白。
服務器進程是從Popen開始的(或指定的多處理)。它要做的第一件事是導入套接字並綁定端口 - 如果不可用,則代碼在異常後停止。因此,只有1個服務器實例可以在機器上運行。
我們知道功能已經準備就緒,在我們可以從服務器中接收有效的獲取請求。
輸入和輸出作為字節發送,使用泡菜轉換為對象。
如果初始化時端口不在(默認)時,則通過哈希輸入代碼選擇將其獨立於函數來源來選擇50000至60000的端口。可能會發生不同功能的碰撞,但不太可能。在多個過程中相同功能的碰撞用於確保一次僅1個服務器進程運行。如果需要,可以指定端口。
用於小輸入和輸出的開銷(很少) -
〜2ms for Urllib.Request的請求
〜4ms,用於使用AIOHTTP.Clientsession的異步請求
大型輸入和輸出的開銷
0.5 MB輸入和輸出(1MB總傳輸)的〜10ms。
5 MB輸入和輸出(10 MB總傳輸)〜60ms。
50 MB輸入和輸出(100 MB總傳輸)〜600ms。
它也可以與提供的裝飾器一起用於功能,沒有函數之外的依賴項。
from auto_function_serving . ServerHandler import ServerHandler
@ ServerHandler . decorator
def someheavyfunction ( args , ** kwargs ):
for i in range ( big_number )
someexpensivecomputation該功能中的導入將起作用
from auto_function_serving . ServerHandler import ServerHandler
@ ServerHandler . decorator
def someheavyfunction ( args , ** kwargs ):
import numpy as np from auto_function_serving . ServerHandler import ServerHandler
@ ServerHandler . decorator
def someheavyfunction ( args , ** kwargs ):
if not hasattr ( someheavyfunction , 'RunOnce' ):
global np
import numpy as np
setattr ( someheavyfunction , 'RunOnce' , None )
... etc當somemodule沒有任何昂貴的全球加載時。
from auto_function_serving . ServerHandler import ServerHandler
from somemodule import someheavyfunction
someheavyfunction = ServerHandler . decorator ( someheavyfunction )在創建新實例之前,可以通過設置serverhandler.ip_address(默認“ 127.0.0.1”)來更改IP地址。
還可以使用AioHTTP異步使請求異步,與FastAPI和其他異步用例一起使用。
AsyncServerHandler具有與ServerHandler相同的用法,除非需要等待或與asyncio.run()或asyncio.get_event_loop()。 run_un_until_complete()一起使用呼叫。
通過設置AsyncServerHandler.TCPConnector_Limit控制TCPConnector限制(默認為100),可以限制異步調用的數量。使用信號量也是要考慮的事情。
圖書館:芹菜,tfserving,torchserve,燒瓶
向全球和當地人發送執行
阿斯特樹
歡迎拉動請求。
Apache許可證2.0