欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

將python腳本打包進docker的完整步驟記錄

 更新時間:2025年09月04日 09:25:35   作者:凌佚  
Docker是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux或Windows操作系統(tǒng)的機器上,這篇文章主要介紹了將python腳本打包進docker的相關(guān)資料,需要的朋友可以參考下

1. 說明

這里以將onnx模型轉(zhuǎn)換為rknn模型為例進行說明。這個python腳本依賴的庫非常多且非常大,并且需要一些額外的系統(tǒng)庫依賴才能正常使用。

教程將以如何進行鏡像拉取、腳本制作、編譯腳本配置、容器打包保存和容器運行進行說明。

注意!這必須在Linux下按照教程操作,Windows的沒有驗證!

2. 準備工作

首先,我們需要準備一個conda環(huán)境,準備rknn模型轉(zhuǎn)換需要的python依賴:

conda create -n rknn python=3.8
conda activate rknn
pip install rknn-toolkit2

然后創(chuàng)建一個目錄,開始我們的工程準備。

2.1 腳本

創(chuàng)建目錄,如onnx2rknn,然后進入目錄中我們寫一個python腳本,命名為convert.py

import argparse
from pathlib import Path
from rknn.api import RKNN

def parse_opt():
    parser = argparse.ArgumentParser(
        description='Convert ONNX model to RKNN format')
    parser.add_argument('--src',
                        type=str,
                        default='best.onnx',
                        help='Path to the ONNX model file (default: best.onnx')
    parser.add_argument('--plat',
                        type=str,
                        choices=[
                            'rk3562', 'rk3566', 'rk3568', 'rk3588', 'rk3576',
                            'rk1808', 'rv1109', 'rv1126'
                        ],
                        default='rk3588',
                        help='Target platform for the RKNN model')
    parser.add_argument('--type',
                        type=str,
                        choices=['i8', 'u8', 'fp'],
                        default='i8',
                        help='Data type for the model (default: fp)')
    parser.add_argument('--dst',
                        type=str,
                        default='best.rknn',
                        help='Output path for the RKNN model (default: best.rknn)')
    return parser.parse_args()

def get_dataset_path():
    img_dir = Path('./images')
    if not img_dir.exists():
        raise FileNotFoundError(f"Image directory '{img_dir}' does not exist.")

    dataset_file = './datasets.txt'
    img_extensions = ['.jpg', '.jpeg', '.png']
    img_paths = []
    for img_path in img_dir.glob('*'):
        if img_path.suffix.lower() in img_extensions:
            img_name = img_path.name
            img_paths.append(f"./images/{img_name}")
    
    if not img_paths:
        raise ValueError(f"No valid images found in '{img_dir}'.")
    with open(dataset_file, 'w') as f:
        for img in img_paths:
            f.write(f"{img}\n")
    print(f"Dataset file created at: {dataset_file}")
    return dataset_file

if __name__ == '__main__':
    print('---------- parse arguments ----------')
    opt = parse_opt()
    
    print('---------- prepare datasets ----------')
    try:
        dataset_path = get_dataset_path()
    except Exception as e:
        print(f"Error preparing dataset: {e}")
        exit(1)

    print('---------- rknn ----------')
    rknn = RKNN()

    rknn.config(mean_values=[[0, 0, 0]],
                std_values=[[255, 255, 255]],
                target_platform=opt.plat)

    ret = rknn.load_onnx(model=opt.src)
    if ret != 0:
        print('Load model failed!')
        exit(ret)

    if opt.type == 'i8':
        do_quant = True
    elif opt.type == 'u8':
        do_quant = True
        rknn.config(quantization_method='dynamic')
    else:
        do_quant = False
        
    ret = rknn.build(do_quantization=do_quant, dataset=dataset_path)
    if ret != 0:
        print('Build model failed!')
        exit(ret)

    ret = rknn.export_rknn(opt.dst)
    if ret != 0:
        print('Export rknn model failed!')
        exit(ret)

    # Release
    rknn.release()

    print(f'RKNN model exported to: {opt.dst}')
    print('---------- done ----------')

2.2 依賴

然后我們需要進行處理,在目錄下打開終端:

conda activate rknn
pip freeze > requirements.txt
pip download -r requirements.txt -d ./dependencies

這樣就可以得到所有以來的whl包了。

2.3 數(shù)據(jù)

在目錄下,我們創(chuàng)建一個images文件夾,然后隨便放一些可以用來進行模型量化驗證的圖片。

2.4 目錄結(jié)構(gòu)

按照如上處理之后,我們的目錄結(jié)構(gòu)是這個樣子的:

./onnx2rknn/
├── convert.py
├── dependencies
├── images
└── requirements.txt

3. 鏡像

直接制作鏡像有難度,而且無法掌控大小,所以我們需要一個初始鏡像。由于我們使用到的rknn-toolkit2推薦使用python3.8,并且我們前面創(chuàng)建的conda環(huán)境也是用的python3.8,所以我們最好找一個對應(yīng)的初始鏡像。由于我們的conda環(huán)境中的python3.8.20,所以這里我們使用:

docker pull python:3.8.20-slim

拉取了初始鏡像之后我們就可以開始自己的鏡像制作了。

3.1 腳本

要制作一個我們自己的docker鏡像,就需要寫一個Dockerfile,所以我們在目錄下新建一個文件,名為Dockerfile,目錄結(jié)構(gòu)如下:

./onnx2rknn/
├── convert.py
├── dependencies
├── Dockerfile
├── images
└── requirements.txt

Dockerfile中增加如下內(nèi)容:

# 使用官方Python基礎(chǔ)鏡像
# 推薦slim鏡像減小體積
FROM python:3.8.20-slim

# ARG HTTP_PROXY
# ARG HTTPS_PROXY

# 安裝依賴
RUN apt-get update &&\
    apt-get install -y --no-install-recommends libgl1 libglib2.0-0 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 設(shè)置工作目錄
WORKDIR /app

# 復(fù)制python依賴并安裝
COPY requirements.txt ./
COPY dependencies ./dependencies/
RUN pip install --no-cache-dir --no-index --find-links=./dependencies -r requirements.txt && rm -rf ./dependencies

# 復(fù)制項目代碼
COPY convert.py .
COPY images ./images/

# 設(shè)置啟動命令
# CMD ["python", "convert.py"]
# 能夠保證鏡像啟動之后不退出,這樣才能方便進行vscode連接
CMD ["/bin/bash", "-c", "tail -f /dev/null"]

這些就可以實現(xiàn)自動在鏡像中安裝需要的依賴,和安裝剛才準備好的python依賴包,然后將我們的python腳本和images文件夾拷貝進去。

3.2 編譯

腳本寫好了,那么就可以進行docker打包,也就是使用Dockerfile進行編譯。在目錄下打開終端:

docker build -t onnx2rknn:1.0.0 .
# docker build --build-arg HTTP_PROXY="http://10.1.41.43:7890" --build-arg HTTPS_PROXY="http://10.1.41.43:7890" -t onnx2rknn:1.0.0 .

3.3 鏡像

編譯完成之后,我們可以使用命令查看我們的鏡像了:

captain@ubuntu2404:~$ docker images
REPOSITORY    TAG           IMAGE ID       CREATED          SIZE
onnx2rknn     1.0.0         0d5d2f9c2a23   47 minutes ago   6.51GB
ubuntu        24.04         bf16bdcff9c9   2 weeks ago      78.1MB
hello-world   latest        74cc54e27dc4   4 months ago     10.1kB
python        3.8.20-slim   b5f62925bd0f   9 months ago     125MB

然后注意到這里的onnx2rknn鏡像已經(jīng)顯示了。

那么這個時候我們?nèi)绻谄渌麢C器上進行部署,則可以通過命令保存鏡像:

docker save -o onnx2rknn-1.0.0.tar.gz onnx2rknn:1.0.0 

然后我們可以在目錄下得到onnx2rknn-1.0.0.tar.gz的鏡像安裝包,就可以在其他機器上進行部署了。由于rknn-toolkit2依賴的東西非常多且大,所以這個鏡像體積也比較離譜……

在其他機器上進行部署可以使用命令:

docker load -i onnx2rknn-1.0.0.tar.gz

4. 運行

剛剛編譯的機器上可以直接運行,也可以通過命令部署之后,在其他機器上運行,運行的命令:

docker run onnx2rknn:1.0.0

然后,會發(fā)現(xiàn),終端啥輸出也沒有,這就正常了……

4.1 vscode遠程

如果你想用docker命令來進入容器的shell環(huán)境也可以,只不過命令很麻煩,我也不想折騰,如果有興趣請自行g(shù)oogle一下。這里介紹如何使用vscode進入到容器中進行開發(fā)。

首先打開vscode,安裝兩個插件:

安裝這兩個插件之后,你就可以通過vscode看到運行中的容器了,然后我們通過這里進入容器:

直接點擊這個箭頭,就可以進入容器了,然后一定要打開/app文件夾!這個目錄才是你剛才將腳本拷貝進來的目錄!可以看到:

然后就可以看到這里的腳本了。我們拖一個best.onnx進來:

然后打開終端,直接執(zhí)行命令:

python convert.py

然后就可以看到正常運行了,最后目錄下得到了best.rknn,然后將其拖出來,就可以正常使用了……

總結(jié)

到此這篇關(guān)于將python腳本打包進docker的文章就介紹到這了,更多相關(guān)python腳本打包進docker內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論