簡介
你是否經常遇到下載的github開源知名項目,不知如何調試?只知道按說明的命令行運行?遇到異常或想改造也無從下手?這篇文檔章將指導你如何入手調試別人的大型開源項目。
常見項目使用說明及代碼如何調試
常見情況一
- 使用說明: 命令行配好Python環境,執行如下腳本即可運行。
python main.py --modelpath '/data/model/chat' --type 'infer'
- 應對方法: 一般這類調用方式,在python代碼層次上都是用了 argparse 模塊, 加載參數類似于如下這樣 ,
import argparsedef main():parser = argparse.ArgumentParser(description='Process inference parameters')parser.add_argument('--model_type', type=str, help='Type of the model for inference')# Add more arguments as neededargs = parser.parse_args()
?這種情況是絕大多數項目實現外部傳參的標準形式,此時最差的方法是,找到傳參函數和位置,一個個修改代碼設置。
第二種思路是pycharm等調試器中,調試配置里輸入傳參參數(大多數人理解的)。
第三種最佳方案,調試代碼中利用sys去指定,假設我們項目中新起一個demo.py文件,大致如下:
# -*- encoding: utf-8 -*-
"""
@File : demo.py
@Description : None
@Author : 一只特立獨行的羱
@Contact : 未知
@License : (C)Copyright 2019-2030,xx@Modify Time @Version
------------ --------
2024/7/3 14:31 1.0
"""from swift.cli import infer
from swift.cli import web_uiimport os
import sys
#模擬命令行參數
sys.argv = ['demo.py','--model_type', 'deepseek-vl-7b-chat','--torch_dtype', 'torch.float16','--model_id_or_path', '/ai/llmdata/modelfile/deepseek-vl-7b-chat','--local_repo_path', '/ai/llmdata/home/yuanxf/DeepSeek-VL/']
#命令行參數會掛在到demo.py文件環境中,再調用下面那個需要參數的函數時,會自動從系統重獲取到
infer.infer_main() #要調用的python函數
常見情況二
- 使用說明: 命令行配好Python環境,執行如下腳本即可運行。
SWIFT_UI_LANG=zh WEBUI_SERVER=0.0.0.0 WEBUI_PORT=7861 WEBUI_SHARE=1 swift web-ui
- 應對方法: 一般這類命令,很明顯可以看出這個pip install的包可以提供執行文件swift,用which命令可查看到,該文件在env的bin下放著。所以我們要看源碼中的setup.py文件,找到這個swift命令帶的不同參數映射到代碼那些文件上了。如下是我的setup.py部分內容示例:
setup(name='ms-swift',version=get_version(),description='Swift: Scalable lightWeight Infrastructure for Fine-Tuning',long_description=readme(),long_description_content_type='text/markdown',author='DAMO ModelScope teams',author_email='contact@modelscope.cn',keywords='python, petl, efficient tuners',url='https://github.com/modelscope/swift',packages=find_packages(exclude=('configs', 'demo')),include_package_data=True,package_data={'': ['*.h', '*.cpp', '*.cu'],},classifiers=['Development Status :: 4 - Beta','License :: OSI Approved :: Apache Software License','Operating System :: OS Independent','Programming Language :: Python :: 3','Programming Language :: Python :: 3.7','Programming Language :: Python :: 3.8','Programming Language :: Python :: 3.9','Programming Language :: Python :: 3.10',],license='Apache License 2.0',tests_require=parse_requirements('requirements/tests.txt'),install_requires=install_requires,extras_require=extra_requires,entry_points={'console_scripts': ['swift=swift.cli.main:cli_main']},dependency_links=deps_link,zip_safe=False)
從這,我就基本知道swift命令是被映射到swift.cli.main:cli_main這個方法下了,在往下代碼查閱就可以找到各命令對應的邏輯。
好了,這里直接聊傳參,很明顯這類其實是系統環境,就是我們系統環境變量中存在WEBUI_PORT=7861這類。那這樣代碼層也可以等價修改命令如下:
#設置環境變量
source SWIFT_UI_LANG=zh
source WEBUI_SERVER=0.0.0.0 WEBUI_PORT=7861
#執行
swift web-ui
明白原理后,我們就可以新起一個demo.py文件,靠os包傳參了:
# -*- encoding: utf-8 -*-
"""
@File : demo.py
@Description : None
@Author : 一只特立獨行的羱
@Contact : 未知
@License : (C)Copyright 2019-2030,xx@Modify Time @Version
------------ --------
2024/7/3 14:31 1.0
"""from swift.cli import web_uiimport os
import sys# 設置系統參數
os.environ['WEBUI_SERVER'] = '0.0.0.0'
os.environ['WEBUI_PORT'] = '7861'
web_ui.run_ui() # 需要調用參數的函數