简介
你是否经常遇到下载的github开源知名项目,不知如何调试?只知道按说明的命令行运行?遇到异常或想改造也无从下手?这篇文档章将指导你如何入手调试别人的大型开源项目。
常见项目使用说明及代码如何调试
常见情况一
- 使用说明: 命令行配好Python环境,执行如下脚本即可运行。
bash
python main.py --modelpath '/data/model/chat' --type 'infer'
- 应对方法: 一般这类调用方式,在python代码层次上都是用了 argparse 模块, 加载参数类似于如下这样 ,
python
import argparse
def 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 needed
args = parser.parse_args()
这种情况是绝大多数项目实现外部传参的标准形式,此时最差的方法是,找到传参函数和位置,一个个修改代码设置。
第二种思路是pycharm等调试器中,调试配置里输入传参参数(大多数人理解的)。
第三种最佳方案,调试代码中利用sys去指定,假设我们项目中新起一个demo.py文件,大致如下:
python
# -*- 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_ui
import 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环境,执行如下脚本即可运行。
bash
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部分内容示例:
python
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这类。那这样代码层也可以等价修改命令如下:
bash
#设置环境变量
source SWIFT_UI_LANG=zh
source WEBUI_SERVER=0.0.0.0 WEBUI_PORT=7861
#执行
swift web-ui
明白原理后,我们就可以新起一个demo.py文件,靠os包传参了:
python
# -*- 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_ui
import os
import sys
# 设置系统参数
os.environ['WEBUI_SERVER'] = '0.0.0.0'
os.environ['WEBUI_PORT'] = '7861'
web_ui.run_ui() # 需要调用参数的函数