diff --git a/README.md b/README.md index 3359c10d..40253b16 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,8 @@ Compared to ChatGLM's [P-Tuning](https://github.com/THUDM/ChatGLM2-6B/tree/main/ ## Changelog +[24/10/09] We supported downloading pre-trained models and datasets from the **[Modelers Hub](https://modelers.cn/models)** for Chinese mainland users. See [this tutorial](#download-from-modelers-hub) for usage. + [24/09/19] We support fine-tuning the **[Qwen2.5](https://qwenlm.github.io/blog/qwen2.5/)** models. [24/08/30] We support fine-tuning the **[Qwen2-VL](https://qwenlm.github.io/blog/qwen2-vl/)** models. Thank [@simonJJJ](https://github.com/simonJJJ)'s PR. @@ -363,7 +365,7 @@ cd LLaMA-Factory pip install -e ".[torch,metrics]" ``` -Extra dependencies available: torch, torch-npu, metrics, deepspeed, liger-kernel, bitsandbytes, hqq, eetq, gptq, awq, aqlm, vllm, galore, badam, adam-mini, qwen, modelscope, quality +Extra dependencies available: torch, torch-npu, metrics, deepspeed, liger-kernel, bitsandbytes, hqq, eetq, gptq, awq, aqlm, vllm, galore, badam, adam-mini, qwen, modelscope, quality, openmind > [!TIP] > Use `pip install --no-deps -e .` to resolve package conflicts. @@ -415,7 +417,7 @@ Download the pre-built Docker images: [32GB](http://mirrors.cn-central-221.ovaij ### Data Preparation -Please refer to [data/README.md](data/README.md) for checking the details about the format of dataset files. You can either use datasets on HuggingFace / ModelScope hub or load the dataset in local disk. +Please refer to [data/README.md](data/README.md) for checking the details about the format of dataset files. You can use datasets on HuggingFace hub, ModelScope hub, modelers hub or load the dataset in local disk. > [!NOTE] > Please update `data/dataset_info.json` to use your custom dataset. @@ -483,6 +485,7 @@ docker build -f ./docker/docker-cuda/Dockerfile \ docker run -dit --gpus=all \ -v ./hf_cache:/root/.cache/huggingface \ -v ./ms_cache:/root/.cache/modelscope \ + -v ./om_cache:/root/.cache/openmind \ -v ./data:/app/data \ -v ./output:/app/output \ -p 7860:7860 \ @@ -507,6 +510,7 @@ docker build -f ./docker/docker-npu/Dockerfile \ docker run -dit \ -v ./hf_cache:/root/.cache/huggingface \ -v ./ms_cache:/root/.cache/modelscope \ + -v ./om_cache:/root/.cache/openmind \ -v ./data:/app/data \ -v ./output:/app/output \ -v /usr/local/dcmi:/usr/local/dcmi \ @@ -540,6 +544,7 @@ docker build -f ./docker/docker-rocm/Dockerfile \ docker run -dit \ -v ./hf_cache:/root/.cache/huggingface \ -v ./ms_cache:/root/.cache/modelscope \ + -v ./om_cache:/root/.cache/openmind \ -v ./data:/app/data \ -v ./output:/app/output \ -v ./saves:/app/saves \ @@ -560,6 +565,7 @@ docker exec -it llamafactory bash - `hf_cache`: Utilize Hugging Face cache on the host machine. Reassignable if a cache already exists in a different directory. - `ms_cache`: Similar to Hugging Face cache but for ModelScope users. +- `om_cache`: Similar to Hugging Face cache but for Modelers users. - `data`: Place datasets on this dir of the host machine so that they can be selected on LLaMA Board GUI. - `output`: Set export dir to this location so that the merged result can be accessed directly on the host machine. @@ -584,6 +590,16 @@ export USE_MODELSCOPE_HUB=1 # `set USE_MODELSCOPE_HUB=1` for Windows Train the model by specifying a model ID of the ModelScope Hub as the `model_name_or_path`. You can find a full list of model IDs at [ModelScope Hub](https://modelscope.cn/models), e.g., `LLM-Research/Meta-Llama-3-8B-Instruct`. +### Download from Modelers Hub + +You can also use Modelers Hub to download models and datasets. + +```bash +export USE_OPENMIND_HUB=1 # `set USE_OPENMIND_HUB=1` for Windows +``` + +Train the model by specifying a model ID of the Modelers Hub as the `model_name_or_path`. You can find a full list of model IDs at [Modelers Hub](https://modelers.cn/models), e.g., `TeleAI/TeleChat-7B-pt`. + ### Use W&B Logger To use [Weights & Biases](https://wandb.ai) for logging experimental results, you need to add the following arguments to yaml files. diff --git a/README_zh.md b/README_zh.md index 20e86853..61aa860c 100644 --- a/README_zh.md +++ b/README_zh.md @@ -75,6 +75,7 @@ https://github.com/user-attachments/assets/e6ce34b0-52d5-4f3e-a830-592106c4c272 ## 更新日志 +[24/10/09] 我们支持了从 **[魔乐社区](https://modelers.cn/models)** 下载预训练模型和数据集。详细用法请参照 [此教程](#从魔乐社区下载)。 [24/09/19] 我们支持了 **[Qwen2.5](https://qwenlm.github.io/blog/qwen2.5/)** 模型的微调。 @@ -364,7 +365,7 @@ cd LLaMA-Factory pip install -e ".[torch,metrics]" ``` -可选的额外依赖项:torch、torch-npu、metrics、deepspeed、liger-kernel、bitsandbytes、hqq、eetq、gptq、awq、aqlm、vllm、galore、badam、adam-mini、qwen、modelscope、quality +可选的额外依赖项:torch、torch-npu、metrics、deepspeed、liger-kernel、bitsandbytes、hqq、eetq、gptq、awq、aqlm、vllm、galore、badam、adam-mini、qwen、modelscope、quality、openmind > [!TIP] > 遇到包冲突时,可使用 `pip install --no-deps -e .` 解决。 @@ -416,7 +417,7 @@ source /usr/local/Ascend/ascend-toolkit/set_env.sh ### 数据准备 -关于数据集文件的格式,请参考 [data/README_zh.md](data/README_zh.md) 的内容。你可以使用 HuggingFace / ModelScope 上的数据集或加载本地数据集。 +关于数据集文件的格式,请参考 [data/README_zh.md](data/README_zh.md) 的内容。你可以使用 HuggingFace , ModelScope 或者 Modelers 上的数据集或加载本地数据集。 > [!NOTE] > 使用自定义数据集时,请更新 `data/dataset_info.json` 文件。 @@ -484,6 +485,7 @@ docker build -f ./docker/docker-cuda/Dockerfile \ docker run -dit --gpus=all \ -v ./hf_cache:/root/.cache/huggingface \ -v ./ms_cache:/root/.cache/modelscope \ + -v ./om_cache:/root/.cache/openmind \ -v ./data:/app/data \ -v ./output:/app/output \ -p 7860:7860 \ @@ -508,6 +510,7 @@ docker build -f ./docker/docker-npu/Dockerfile \ docker run -dit \ -v ./hf_cache:/root/.cache/huggingface \ -v ./ms_cache:/root/.cache/modelscope \ + -v ./om_cache:/root/.cache/openmind \ -v ./data:/app/data \ -v ./output:/app/output \ -v /usr/local/dcmi:/usr/local/dcmi \ @@ -541,6 +544,7 @@ docker build -f ./docker/docker-rocm/Dockerfile \ docker run -dit \ -v ./hf_cache:/root/.cache/huggingface \ -v ./ms_cache:/root/.cache/modelscope \ + -v ./om_cache:/root/.cache/openmind \ -v ./data:/app/data \ -v ./output:/app/output \ -v ./saves:/app/saves \ @@ -561,6 +565,7 @@ docker exec -it llamafactory bash - `hf_cache`:使用宿主机的 Hugging Face 缓存文件夹,允许更改为新的目录。 - `ms_cache`:类似 Hugging Face 缓存文件夹,为 ModelScope 用户提供。 +- `om_cache`:类似 Hugging Face 缓存文件夹,为 Modelers 用户提供。 - `data`:宿主机中存放数据集的文件夹路径。 - `output`:将导出目录设置为该路径后,即可在宿主机中访问导出后的模型。 @@ -585,6 +590,17 @@ export USE_MODELSCOPE_HUB=1 # Windows 使用 `set USE_MODELSCOPE_HUB=1` 将 `model_name_or_path` 设置为模型 ID 来加载对应的模型。在[魔搭社区](https://modelscope.cn/models)查看所有可用的模型,例如 `LLM-Research/Meta-Llama-3-8B-Instruct`。 +### 从魔乐社区下载 + +您也可以通过下述方法使用魔乐社区,在魔乐社区上下载数据集和模型。 + +```bash +export USE_OPENMIND_HUB=1 # Windows 使用 `set USE_OPENMIND_HUB=1` +``` + +将 `model_name_or_path` 设置为模型 ID 来加载对应的模型。在[魔乐社区](https://modelers.cn/models)查看所有可用的模型,例如 `TeleAI/TeleChat-7B-pt`。 + + ### 使用 W&B 面板 若要使用 [Weights & Biases](https://wandb.ai) 记录实验数据,请在 yaml 文件中添加下面的参数。 diff --git a/src/llamafactory/__init__.py b/src/llamafactory/__init__.py index ffc8c9ad..dd5d1a01 100644 --- a/src/llamafactory/__init__.py +++ b/src/llamafactory/__init__.py @@ -38,6 +38,7 @@ Force check imports: FORCE_CHECK_IMPORTS=1 Force using torchrun: FORCE_TORCHRUN=1 Set logging verbosity: LLAMAFACTORY_VERBOSITY=WARN Use modelscope: USE_MODELSCOPE_HUB=1 +Use openmind: USE_OPENMIND_HUB=1 """ from .extras.env import VERSION diff --git a/src/llamafactory/data/loader.py b/src/llamafactory/data/loader.py index 362d57e9..03a38fa8 100644 --- a/src/llamafactory/data/loader.py +++ b/src/llamafactory/data/loader.py @@ -53,7 +53,7 @@ def _load_single_dataset( """ logger.info("Loading dataset {}...".format(dataset_attr)) data_path, data_name, data_dir, data_files = None, None, None, None - if dataset_attr.load_from in ["hf_hub", "ms_hub"]: + if dataset_attr.load_from in ["om_hub", "hf_hub", "ms_hub"]: data_path = dataset_attr.dataset_name data_name = dataset_attr.subset data_dir = dataset_attr.folder @@ -84,7 +84,24 @@ def _load_single_dataset( else: raise NotImplementedError("Unknown load type: {}.".format(dataset_attr.load_from)) - if dataset_attr.load_from == "ms_hub": + if dataset_attr.load_from == "om_hub": + try: + from openmind import OmDataset + from openmind.utils.hub import OM_DATASETS_CACHE + cache_dir = model_args.cache_dir or OM_DATASETS_CACHE + dataset = OmDataset.load_dataset( + path=data_path, + name=data_name, + data_dir=data_dir, + data_files=data_files, + split=data_args.split, + cache_dir=cache_dir, + token=model_args.ms_hub_token, + streaming=(data_args.streaming and (dataset_attr.load_from != "file")), + ) + except ImportError: + raise ImportError("Please install openmind via `pip install openmind -U`") + elif dataset_attr.load_from == "ms_hub": require_version("modelscope>=1.11.0", "To fix: pip install modelscope>=1.11.0") from modelscope import MsDataset from modelscope.utils.config_ds import MS_DATASETS_CACHE diff --git a/src/llamafactory/data/parser.py b/src/llamafactory/data/parser.py index 15a6eab8..696cd488 100644 --- a/src/llamafactory/data/parser.py +++ b/src/llamafactory/data/parser.py @@ -20,7 +20,7 @@ from typing import Any, Dict, List, Literal, Optional, Sequence from transformers.utils import cached_file from ..extras.constants import DATA_CONFIG -from ..extras.misc import use_modelscope +from ..extras.misc import use_openmind, use_modelscope @dataclass @@ -97,8 +97,13 @@ def get_dataset_list(dataset_names: Optional[Sequence[str]], dataset_dir: str) - dataset_list: List["DatasetAttr"] = [] for name in dataset_names: - if dataset_info is None: # dataset_dir is ONLINE - load_from = "ms_hub" if use_modelscope() else "hf_hub" + if dataset_info is None: # dataset_dir is ONLINE + if use_openmind(): + load_from = "om_hub" + if use_modelscope(): + load_from = "ms_hub" + if load_from is None: + load_from = "hf_hub" dataset_attr = DatasetAttr(load_from, dataset_name=name) dataset_list.append(dataset_attr) continue @@ -106,11 +111,14 @@ def get_dataset_list(dataset_names: Optional[Sequence[str]], dataset_dir: str) - if name not in dataset_info: raise ValueError("Undefined dataset {} in {}.".format(name, DATA_CONFIG)) + has_om_url = "om_hub_url" in dataset_info[name] has_hf_url = "hf_hub_url" in dataset_info[name] has_ms_url = "ms_hub_url" in dataset_info[name] - if has_hf_url or has_ms_url: - if (use_modelscope() and has_ms_url) or (not has_hf_url): + if has_om_url or has_hf_url or has_ms_url: + if (use_openmind() and has_om_url) or (not has_hf_url): + dataset_attr = DatasetAttr("om_hub", dataset_name=dataset_info[name]["om_hub_url"]) + elif (use_modelscope() and has_ms_url) or (not has_hf_url): dataset_attr = DatasetAttr("ms_hub", dataset_name=dataset_info[name]["ms_hub_url"]) else: dataset_attr = DatasetAttr("hf_hub", dataset_name=dataset_info[name]["hf_hub_url"]) diff --git a/src/llamafactory/extras/misc.py b/src/llamafactory/extras/misc.py index 7d0a457a..4c42900d 100644 --- a/src/llamafactory/extras/misc.py +++ b/src/llamafactory/extras/misc.py @@ -231,18 +231,31 @@ def torch_gc() -> None: torch.cuda.empty_cache() -def try_download_model_from_ms(model_args: "ModelArguments") -> str: - if not use_modelscope() or os.path.exists(model_args.model_name_or_path): +def try_download_model_from_other_hub(model_args: "ModelArguments") -> str: + if (not use_openmind() and not use_modelscope()) or os.path.exists(model_args.model_name_or_path): return model_args.model_name_or_path - try: - from modelscope import snapshot_download + if use_openmind(): + try: + import openmind + from openmind.utils.hub import snapshot_download - revision = "master" if model_args.model_revision == "main" else model_args.model_revision - return snapshot_download(model_args.model_name_or_path, revision=revision, cache_dir=model_args.cache_dir) - except ImportError: - raise ImportError("Please install modelscope via `pip install modelscope -U`") + revision = "main" if model_args.model_revision == "main" else model_args.model_revision + return snapshot_download(model_args.model_name_or_path, revision=revision, cache_dir=model_args.cache_dir) + except ImportError: + raise ImportError("Please install openmind and openmind_hub via `pip install openmind -U`") + if use_modelscope(): + try: + from modelscope import snapshot_download + + revision = "master" if model_args.model_revision == "main" else model_args.model_revision + return snapshot_download(model_args.model_name_or_path, revision=revision, cache_dir=model_args.cache_dir) + except ImportError: + raise ImportError("Please install modelscope via `pip install modelscope -U`") + +def use_openmind() -> bool: + return os.environ.get("USE_OPENMIND_HUB", "0").lower() in ["true", "1"] def use_modelscope() -> bool: return os.environ.get("USE_MODELSCOPE_HUB", "0").lower() in ["true", "1"] diff --git a/src/llamafactory/model/loader.py b/src/llamafactory/model/loader.py index fb71498b..7613c092 100644 --- a/src/llamafactory/model/loader.py +++ b/src/llamafactory/model/loader.py @@ -19,7 +19,7 @@ from transformers import AutoConfig, AutoModelForCausalLM, AutoModelForVision2Se from trl import AutoModelForCausalLMWithValueHead from ..extras.logging import get_logger -from ..extras.misc import count_parameters, skip_check_imports, try_download_model_from_ms +from ..extras.misc import count_parameters, skip_check_imports, try_download_model_from_other_hub from .adapter import init_adapter from .model_utils.liger_kernel import apply_liger_kernel from .model_utils.misc import register_autoclass @@ -50,7 +50,7 @@ def _get_init_kwargs(model_args: "ModelArguments") -> Dict[str, Any]: Note: including inplace operation of model_args. """ skip_check_imports() - model_args.model_name_or_path = try_download_model_from_ms(model_args) + model_args.model_name_or_path = try_download_model_from_other_hub(model_args) return { "trust_remote_code": True, "cache_dir": model_args.cache_dir,