File size: 6,190 Bytes
96fe658 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# Copyright (c) Alibaba, Inc. and its affiliates.
# !/usr/bin/env python
import os
from setuptools import find_packages, setup
from typing import List
def readme():
with open('README.md', encoding='utf-8') as f:
content = f.read()
return content
version_file = 'swift/version.py'
def get_version():
about = {}
with open(version_file, 'r', encoding='utf-8') as f:
exec(f.read(), about)
return about['__version__']
def parse_requirements(fname='requirements.txt', with_version=True):
"""
Parse the package dependencies listed in a requirements file but strips
specific versioning information.
Args:
fname (str): path to requirements file
with_version (bool, default=False): if True include version specs
Returns:
List[str]: list of requirements items
CommandLine:
python -c "import setup; print(setup.parse_requirements())"
"""
import re
import sys
from os.path import exists
require_fpath = fname
def parse_line(line):
"""
Parse information from a line in a requirements text file
"""
if line.startswith('-r '):
# Allow specifying requirements in other files
target = line.split(' ')[1]
relative_base = os.path.dirname(fname)
absolute_target = os.path.join(relative_base, target)
for info in parse_require_file(absolute_target):
yield info
else:
info = {'line': line}
if line.startswith('-e '):
info['package'] = line.split('#egg=')[1]
else:
# Remove versioning from the package
pat = '(' + '|'.join(['>=', '==', '>']) + ')'
parts = re.split(pat, line, maxsplit=1)
parts = [p.strip() for p in parts]
info['package'] = parts[0]
if len(parts) > 1:
op, rest = parts[1:]
if ';' in rest:
# Handle platform specific dependencies
# http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies
version, platform_deps = map(str.strip, rest.split(';'))
info['platform_deps'] = platform_deps
else:
version = rest # NOQA
info['version'] = (op, version)
yield info
def parse_require_file(fpath):
with open(fpath, 'r', encoding='utf-8') as f:
for line in f.readlines():
line = line.strip()
if line.startswith('http'):
print('skip http requirements %s' % line)
continue
if line and not line.startswith('#') and not line.startswith('--'):
for info in parse_line(line):
yield info
elif line and line.startswith('--find-links'):
eles = line.split()
for e in eles:
e = e.strip()
if 'http' in e:
info = dict(dependency_links=e)
yield info
def gen_packages_items():
items = []
deps_link = []
if exists(require_fpath):
for info in parse_require_file(require_fpath):
if 'dependency_links' not in info:
parts = [info['package']]
if with_version and 'version' in info:
parts.extend(info['version'])
if not sys.version.startswith('3.4'):
# apparently package_deps are broken in 3.4
platform_deps = info.get('platform_deps')
if platform_deps is not None:
parts.append(';' + platform_deps)
item = ''.join(parts)
items.append(item)
else:
deps_link.append(info['dependency_links'])
return items, deps_link
return gen_packages_items()
if __name__ == '__main__':
install_requires, deps_link = parse_requirements('requirements.txt')
extra_requires = {}
all_requires = []
extra_requires['eval'], _ = parse_requirements('requirements/eval.txt')
extra_requires['swanlab'], _ = parse_requirements('requirements/swanlab.txt')
all_requires.extend(install_requires)
all_requires.extend(extra_requires['eval'])
all_requires.extend(extra_requires['swanlab'])
extra_requires['all'] = all_requires
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.8',
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
'Programming Language :: Python :: 3.12',
],
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', 'megatron=swift.cli._megatron.main:cli_main']
},
dependency_links=deps_link,
zip_safe=False)
|