常用的代码组件

一、argparse相关

  1.1 参数打印

print("***** Parmeters *****".rjust(62))
    arguments = vars(args)
    for key, value in arguments.items():
        print(f"{key}".rjust(50)+ f": {value}")
print("***** Parmeters *****".rjust(62))

  1.2 huggingface trainer logger

def set_logger_with_seed(training_args: Seq2SeqTrainingArguments):
    import logging,sys
    import transformers
    from transformers import set_seed
    logger = logging.getLogger(__name__)  # 7. 创建一个日志记录器,用于记录脚本运行时的日志信息。
    # Setup logging
    # 10. 设置日志记录的基本配置,包括日志格式、日期格式和输出处理器(在这里是将日志输出到标准输出流)。
    logging.basicConfig(
        format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
        datefmt="%m/%d/%Y %H:%M:%S",
        handlers=[logging.StreamHandler(sys.stdout)],
    )
    if training_args.should_log:
        # The default of training_args.log_level is passive, so we set log level at info here to have that default.
        # 11. 如果训练参数指定应该记录日志,则将Transformers库的日志级别设置为info(信息级别)。默认情况下,训练参数的日志级别是被动的,所以这里将其设置为信息级别。
        transformers.utils.logging.set_verbosity_info()

    # 12. 获取训练参数指定的进程日志级别,并将该级别设置为当前日志记录器的级别。
    log_level = training_args.get_process_log_level()
    logger.setLevel(log_level)
    # datasets.utils.logging.set_verbosity(log_level)
     # 13. 设置Transformers库的日志级别为训练参数指定的进程日志级别,启用默认的日志处理器和显式的日志格式。
    transformers.utils.logging.set_verbosity(log_level)
    transformers.utils.logging.enable_default_handler()
    transformers.utils.logging.enable_explicit_format()
    # 设置一切相关的随机种子,保证训练结果的可重现性
    set_seed(training_args.seed)
    return logger

第二种

from loguru import logger
# 重定义终端显示logger颜色
logger.configure(handlers=[
    {
        "sink": sys.stderr,
        "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |<cyan><lvl>{level:8}</></>| {name} : {module}:{line:4} | <cyan>mymodule</> | - <lvl>{message}</>",
        "colorize": True
    },
])

logger.debug('this is debug')
logger.info('this is info')
logger.warning('this is warning')
logger.error('this is error')
logger.critical('this is critical')

二、model 参数 

 2.1 参数打印

from loguru import logger
# 重定义终端显示logger颜色
logger.configure(handlers=[
    {
        "sink": sys.stderr,
        "format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |<cyan><lvl>{level:8}</></>| {name} : {module}:{line:4} | <cyan>mymodule</> | - <lvl>{message}</>",
        "colorize": True
    },
])
def verify_model_dtype(model):
    """
    功能: 查看模型中各种类型的参数的情况
    使用技术: Python 的 defaultdict、model.named_parameters()、参数遍历等
    解决问题: 帮助开发者了解模型中参数的数据类型分布,以及可训练参数的情况,从而更好地优化模型
    """
    logger.info(f"--> model structure: \n{model}")
    ignore_layers = [f"layers.{i}" for i in range(2,21)]  # 减少打印的层数
    logger.info(f"ignore print layers: \n{ignore_layers}")
    for n,v in model.named_parameters():
        # 少打印一些层
        if not any([i in n for i in ignore_layers]):
            if v.requires_grad:
                logger.info(f"trainable model arguments: {n} - {v.dtype} - {v.shape} - {v.device}")
            else:
                logger.info(f"not trainable model arguments: {n} - {v.dtype} - {v.shape} - {v.device}")

    dtype2param_num = defaultdict(int)  # 每种数据类型的参数量
    dtype2param_name = defaultdict(list)  # 每种数据类型的参数名称
    dtype2trainable_param_num = defaultdict(int)  # 每种数据类型参与训练的参数量
    dtype2trainable_param_name = defaultdict(list)  # 每种数据类型参与训练的参数名称
    for name, p in model.named_parameters():
        dtype = p.dtype   # 获取参数的数据类型
        # 统计参数数量和参数名称
        dtype2param_num[dtype] += p.numel()
        dtype2param_name[dtype].append(name)
        # 如果参数参与训练(requires_grad=True),则统计可训练参数的数量和名称
        if p.requires_grad:
            dtype2trainable_param_num[dtype] += p.numel()
            dtype2trainable_param_name[dtype].append(name)
    # 统计全部参数中,各种类型参数分布
    total = 0
    logger.info('verify all params of the model')
    for k, v in dtype2param_num.items():
        total += v
    for k, v in dtype2param_num.items():
        print("all params info: {}  num: {}  {:.3f}%".format(k, v, 100.0 * v / total))  # 打印每种数据类型的参数量和占比
    print()
    
    # 统计可训练参数中,各种类型参数分布
    logger.info('verify trainable params the model')
    total_trainable = 0
    for k, v in dtype2trainable_param_num.items():
        total_trainable += v
    for k, v in dtype2trainable_param_num.items():
        print("trainable params info: {}  num: {}  {:.3f}%".format(k, v, 100.0 * v / total_trainable))
    print()
    for k, v in dtype2trainable_param_name.items():
        print("all params info: {}  trainable layers: {}".format(k, v))   # 打印每种数据类型的可训练参数名称
    print()
    # 查看参与训练的参数情况
    total = sum(p.numel() for p in model.parameters())
    trainable = sum(p.numel() for p in model.parameters() if p.requires_grad)
    logger.info("Total model params: %.2fM" % (total / 1e6))
    logger.info(
        f'trainable params: {trainable} || all params: {total} || trainable%: {round(trainable / total, 4)}')



logger = ...
if training_args.local_rank == 0: # local 为0时打印
    # 打印 TrainingArguments 或 model的config 或 peft model 的 peft_config
    logger.info(f"Training/evaluation parameters {training_args}")
    logger.info(f"model parameters {model.config}")
    logger.info(f"PEFT parameters {peft_config}")

# 进程阻塞,同步所有进程,等待所有进程到达这一点
torch.distributed.barrier()

三、path 

 3.1 pathlib

from typing import Union
from pathlib import Path

# 1. 获得文件、目录的绝对位置路径
def _resolve_path(path: Union[str, Path]) -> Path:
    # Path(path) 将path打包为Path对象
    # Path(path).expanduser().resolve() 将Path对象路径转化为绝对位置路径
    return Path(path).expanduser().resolve()

# 2. Path 对象文件、目录是否存在,返回bool
dir_name.is_dir()
train_file.is_file()
# dir_name 和 train_file都是 Path 对象

# 3. Path 对象创建文件夹
def _mkdir(dir_name: Union[str, Path]):
    dir_name = _resolve_path(dir_name)   # 先将输入路径转换为绝对路径
    if not dir_name.is_dir():            # 检查目录是否存在,使用 is_dir() 方法
        dir_name.mkdir(parents=True, exist_ok=False)   # parents=True 表示递归创建父目录

# 4. Path 对象路径拼接
data_dir / 'train.json'
data_dir / 'dev.json'
# 直接用 / 拼接即可

# 5. Path 对象获得相对路径
dir_path : PosixPath('datas/AdvertiseGen')
file = dir_path / "train.json"
file:  PosixPath('datas/AdvertiseGen/train.json')
    # 获取相对路径
file_name = file.relative_to(dir_path)
# 结果:"train.json"

# 6. Path 对象获取父目录
out_file.parent
# out_file 是Path 对象

(待更...)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot常用的Starter组件包括: 1. spring-boot-starter-web:用于构建Web应用程序的Starter组件,包括Spring MVC和Tomcat。 2. spring-boot-starter-data-jpa:用于使用JPA和Hibernate进行数据持久化的Starter组件。 3. spring-boot-starter-data-redis:用于使用Redis进行数据缓存和存储的Starter组件。 4. spring-boot-starter-security:用于构建安全Web应用程序的Starter组件,包括Spring Security和OAuth2。 5. spring-boot-starter-test:用于编写单元测试和集成测试的Starter组件,包括JUnit、Mockito和Hamcrest等。 6. spring-boot-starter-actuator:用于监控和管理Spring Boot应用程序的Starter组件,包括健康检查、度量指标和追踪等。 7. spring-boot-starter-log4j2:用于使用Log4j2进行日志记录的Starter组件。 8. spring-boot-starter-thymeleaf:用于使用Thymeleaf进行Web页面渲染的Starter组件。 9. spring-boot-starter-mail:用于使用JavaMail发送电子邮件的Starter组件。 10. spring-boot-starter-redis:用于使用Redis进行数据缓存和存储的Starter组件。 ### 回答2: Spring Boot是一个开发Spring应用程序的框架,其中包含许多常用的starter组件,这些组件可以方便地集成到项目中。 1. Web Starter:用于构建基于Web的应用程序,包括Spring MVC、Tomcat等组件,可以轻松地创建RESTful API或Web应用。 2. JPA Starter:提供了对Java持久化API的支持,可以与各种关系型数据库(如MySQL,PostgreSQL,Oracle等)进行集成,简化了数据库操作的配置和使用。 3. Security Starter:提供了基于Spring Security的安全功能,可以用于身份验证、授权和安全访问控制等。 4. Actuator Starter:用于监控和管理Spring Boot应用程序的组件,可以轻松地暴露应用程序的运行时指标和信息,如健康检查、日志、堆栈跟踪等,方便了应用程序的管理和维护。 5. Cache Starter:用于集成缓存机制的组件,可以轻松地使用缓存来提高应用程序的性能和响应时间,支持各种缓存技术,如Ehcache、Redis等。 6. Test Starter:用于编写和运行单元测试和集成测试的组件,可以方便地进行测试驱动的开发和自动化测试。 这些只是Spring Boot的一部分常用starter组件,Spring Boot还提供了许多其他的starter组件,如邮件发送、消息队列、数据缓存等,这些组件可以减少开发人员的工作量,提高开发效率。 ### 回答3: Spring Boot是一个开箱即用的Java框架,它通过提供各种starter组件来简化开发过程,并提供一种快速构建可部署的独立应用的方式。下面是一些常用的Spring Boot starter组件。 1. Spring Boot Starter Web:用于构建Web应用程序的starter组件,包含了Spring MVC、Tomcat、Jackson等常用的Web开发库。 2. Spring Boot Starter Data JPA:用于操作数据库的starter组件,包含了Spring Data JPA、Hibernate等ORM框架,可以快速方便地与数据库交互。 3. Spring Boot Starter Security:提供了基于Spring Security的安全性和权限控制功能的starter组件,可以轻松地实现用户认证、授权和资源保护等功能。 4. Spring Boot Starter Test:用于编写单元测试和集成测试的starter组件,包含了常用的测试框架如JUnit、Mockito等,可以简化测试代码的编写。 5. Spring Boot Starter Actuator:提供了监控和管理Spring Boot应用程序的starter组件,可以通过暴露一些管理端点来获取应用的各种信息,如健康状况、性能指标等。 6. Spring Boot Starter Log4j2:用于日志记录的starter组件,集成了Log4j2日志框架,可以方便地配置和输出应用程序的日志信息。 7. Spring Boot Starter Mail:用于发送电子邮件的starter组件,集成了JavaMail和Spring的邮件模块,可以快速方便地发送邮件。 这些只是一些常用的Spring Boot starter组件,Spring Boot还有很多其他的starter组件,可以根据具体需求选择适合的组件来简化开发过程。这些starter组件的存在大大减少了开发者的工作量,提高了开发效率,使得使用Spring Boot更加方便和易于上手。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值