尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Megatron-LM 可观测性配置指南:基于 OpenTelemetry 与 nemo-lens 的完整参数体系

Megatron-LM 可观测性配置指南:基于 OpenTelemetry 与 nemo-lens 的完整参数体系 Megatron-LM 可观测性配置指南基于 OpenTelemetry 与 nemo-lens 的完整参数体系【免费下载链接】Megatron-LMOngoing research training transformer models at scale项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM导读Megatron-LM 通过 nemo-lens 为核心骨架结合仓库源码系统讲解 CLI 参数、MEGATRON_OTEL_*环境变量、导出秩策略、运行标识与资源属性的完整配置方式。读完后你将掌握从本地调试到生产环境多机训练的全部可观测性配置方案并理解每个参数背后的源码处理逻辑。可观测性配置的整体脉络Megatron-LM 的遥测配置遵循双入口、单一真相的设计CLI 入口--otel-enabled、--otel-service-name、--otel-span-groups三个参数在 megatron/training/arguments.py 的opentelemetry参数组中注册环境变量入口MEGATRON_OTEL_*前缀的环境变量默认情况下才是配置主体两类入口最终都在 megatron/training/global_vars.py 的_set_telemetry()中汇合由NemoLensConfig.from_env()统一加载。值得注意的是CLI 标志具有最高优先级——它们会覆盖对应的环境变量源码中体现为if getattr(args, otel_enabled, False): config.enabled True这样的覆盖逻辑。CLI 参数三个开关直达遥测核心原文档给出了三个 CLI 参数源码中megatron/training/arguments.py的具体定义如下Flag类型说明源码默认值--otel-enabledflag布尔开关启用 OTel 遥测trace 与 metricsFalse--otel-service-name NAMEstring覆盖OTEL_SERVICE_NAME环境变量None--otel-span-groups SPECstring逗号分隔的 span-group 规格见 Span Groups 文档None从源码注释可以看出参数组的默认语义--otel-span-groups接受预设关键字default、per_step、full、all或单独的分组名job、checkpoint、evaluate、model_init、load_checkpoint、step、forward_backward、optimizer、microbatch或二者的混合未设置时默认只产生粗粒度的 job/checkpoint/evaluate span。这三个参数在_set_telemetry()中的处理逻辑为megatron/training/global_vars.pyif not os.environ.get(OTEL_SERVICE_NAME, ).strip(): config.service_name megatron-lm # 未指定服务名时的兜底 if getattr(args, otel_enabled, False): config.enabled True # CLI 强制开启 if getattr(args, otel_service_name, None): config.service_name args.otel_service_name # CLI 覆盖服务名 if getattr(args, otel_span_groups, None): config.span_groups args.otel_span_groups # CLI 覆盖 span 分组这里还有一个容易忽略的细节当OTEL_SERVICE_NAME未设置且未通过 CLI 指定时Megatron 会自动把服务名兜底为megatron-lm。Megatron 专属环境变量MEGATRON_OTEL_*体系每个MEGATRON_OTEL_*变量都是对应的NemoLensConfig字段的别名以NEMO_LENS_*作为回退前缀。它们并非独立设置——设置MEGATRON_OTEL_ENABLED1等价于设置NEMO_LENS_ENABLED1指向同一个底层配置。这种前缀/回退模型让 Megatron 可以管理自己的环境变量命名空间同时继承共享环境中的 lens 默认值。源码中对应NemoLensConfig.from_env(prefixMEGATRON_OTEL, fallback_prefixNEMO_LENS, ...)的调用。完整变量清单变量默认值说明MEGATRON_OTEL_ENABLED0总开关必须设为1才激活遥测MEGATRON_OTEL_RANK_STRATEGYsingle_rank导出秩策略single_rank、all_ranks、sampled、first_rank_per_node或任何通过register_rank_strategy()注册的名称MEGATRON_OTEL_EXPORT_RANK-1用于single_rank指定哪个 rank 导出-1表示最后一个 rankMEGATRON_OTEL_EXPORT_SAMPLE_RATE1.0用于sampled采样比例取值[0.0, 1.0]MEGATRON_OTEL_SAMPLING_STRATEGY空rank_aware或任何通过register_sampling_strategy()注册的名称。为空时保留 OTel SDK 默认采样器MEGATRON_OTEL_TRACES_ENABLED1启用 trace spanMEGATRON_OTEL_METRICS_ENABLED1启用 metrics 仪表MEGATRON_OTEL_LOGS_ENABLED0启用 OTel 日志桥接log bridgeMEGATRON_OTEL_SPAN_GROUPSdefaultspan 粒度规格见 Span Groups 文档MEGATRON_OTEL_EXPORTERotlp导出后端otlp或consoleNEMO_LENS_RUN_ID自动唯一运行标识。自动从SLURM_JOB_ID检测或生成 UUIDNEMO_LENS_USER_ID空可选的用户/团队标签几个需要强调的语义点总开关逻辑MEGATRON_OTEL_ENABLED0时遥测完全关闭。源码中_set_telemetry()在config.enabled为假时不构建资源属性resource_attrs build_telemetry_resource_attrs(args) if config.enabled else {}注释明确指出这是为了避免在遥测关闭时做nvmlInit()/nvmlShutdown()往返的 NVML 探测megatron/training/global_vars.py。日志桥接是可选能力仅当config.enabled and config.logs_enabled且 handle 处于导出状态时才通过setup_logging_bridge()把 Pythonlogging记录桥接到 OTel使日志携带当前 span 的 trace ID。无 lens 时优雅降级如果未安装nemo-lens_set_telemetry()捕获ImportError后把全局 handle 置为None遥测成为空操作不会导致训练启动崩溃megatron/training/global_vars.py。导出秩策略Rank Strategy控制谁真正发送遥测大型分布式训练中如果所有 rank 都导出遥测会产生海量冗余数据。Megatron 通过MEGATRON_OTEL_RANK_STRATEGY提供四种内置策略策略行为single_rank默认只有单个 rank 导出配合MEGATRON_OTEL_EXPORT_RANK指定具体 rank-1表示最后一个 rankall_ranks所有 rank 都导出sampled按MEGATRON_OTEL_EXPORT_SAMPLE_RATE[0.0, 1.0]采样部分 rank 导出first_rank_per_node每个节点只由首个 rank 导出此外还支持通过register_rank_strategy()注册自定义策略。官方文档明确说明默认只有一个 rank最后一个导出这与 observability 总览页By default, only one rank exports (the last rank)的描述一致。sampled策略与 OTel SDK 自带的采样器如parentbased_traceidratio是两个不同维度、可叠加使用的机制前者决定哪些 rank 导出后者决定导出 rank 的哪些 trace 被采样两者通过MEGATRON_OTEL_SAMPLING_STRATEGY协调。标准 OTel SDK 环境变量直接透传Megatron 不拦截标准 OTel SDK 变量它们由 SDK 直接读取生效变量示例OTEL_SERVICE_NAMEmegatron-trainingOTEL_EXPORTER_OTLP_ENDPOINThttp://localhost:4317OTEL_EXPORTER_OTLP_PROTOCOLgrpc或http/protobufOTEL_EXPORTER_OTLP_HEADERSAuthorizationBearer tokenOTEL_TRACES_SAMPLERparentbased_traceidratioOTEL_TRACES_SAMPLER_ARG0.1注意OTEL_SERVICE_NAME与前文 CLI 参数--otel-service-name的优先级关系CLI 参数显式覆盖该环境变量环境变量未设置时由 Megatron 兜底为megatron-lm。运行标识Run Identification跨后端关联同一训练任务每次训练运行都会被自动分配一个唯一的nemo.run.id资源属性并流向所有后端Jaeger、Grafana、Kibana 等用于隔离特定运行。优先级顺序NEMO_LENS_RUN_ID环境变量显式指定最高优先级SLURM_JOB_ID环境变量SLURM 集群上自动检测自动生成的 12 字符 UUID兜底。分布式语义分布式任务中的所有 rank 共享同一个run_id每个 rank 拥有唯一的service.instance.id格式为{run_id}-rank{rank}在 Jaeger、Grafana、Kibana 中按nemo.run.id过滤即可把一次训练运行的所有 trace 与指标隔离出来。在此基础上源码 megatron/training/global_vars.py 还进一步补充了nemo.lens.job_uuid逻辑训练任务跨重启/重排队稳定与nemo.lens.run_uuid单次运行实例每次重启递增两个确定性 UUID 资源属性。它们的构造基于SLURM_ARRAY_JOB_ID/SLURM_JOB_ID、SLURM_RESTART_COUNT、TORCHELASTIC_RESTART_COUNT等环境变量且刻意设计为零通信——所有 rank 和 checkpoint worker 都从同一份继承环境推导出一致的值可扩展到上万 rank 的规模。资源属性Resource Attributes把训练配置烙进每个 spanMegatron 的_set_telemetry()会把训练配置属性写入 OTelResource使它们作为 Jaeger 的 Process 标签出现在运行中的每个 span 上。属性与 Megatron 参数来源的对应关系源码实现在 megatron/training/global_vars.py 的build_telemetry_resource_attrs()属性Megatron 参数来源dl.local_rankargs.local_rankdl.tensor_parallel.sizeargs.tensor_model_parallel_sizedl.pipeline_parallel.sizeargs.pipeline_model_parallel_sizedl.data_parallel.sizeargs.data_parallel_sizedl.batch_sizeargs.global_batch_sizedl.sequence_lengthargs.seq_lengthmegatron.num_layersargs.num_layersmegatron.hidden_sizeargs.hidden_sizemegatron.num_attention_headsargs.num_attention_headsmegatron.train_itersargs.train_itersmegatron.micro_batch_sizeargs.micro_batch_sizemegatron.ckpt_formatargs.ckpt_formatmegatron.precisionfp16/bf16/fp32由args.fp16、args.bf16标志推导此外还有 lens 资源检测自动发现的属性hostname、PID、GPU 数量、SLURM 元数据、Kubernetes 元数据以及 Megatron 额外注入的 GPU 物理身份dl.gpu.index、dl.gpu.name、dl.gpu.uuid、dl.gpu.serial、dl.gpu.pci_bus_id通过_detect_gpu_identity()基于 NVML 探测见 megatron/training/global_vars.py和 SLURM 身份slurm.job.id、slurm.sluid、slurm.cluster、slurm.array.job_id等。这里有一个源码层面的细节值得注意build_telemetry_resource_attrs()被设计为主进程与异步 checkpoint worker 共享——megatron/training/async_utils.py 的build_otel_worker_bootstrap()会复用同一函数构造 worker 进程的资源属性字典确保两边按构造就一致而不是两份独立实现随参数演进悄悄漂移。典型配置四种开箱即用的实战场景原文档给出了四套可直接复制的配置这里结合源码补充语义说明。场景一本地开发 console 导出器export MEGATRON_OTEL_ENABLED1 export MEGATRON_OTEL_EXPORTERconsole python examples/run_simple_mcore_train_loop.pyspan 与指标直接打印到 stdout适合快速验证遥测是否生效。examples/run_simple_mcore_train_loop.py是仓库中的最小核心训练循环示例无需完整参数体系即可跑通。场景二本地 Collectorlocalhost OTLP 端点export MEGATRON_OTEL_ENABLED1 export OTEL_EXPORTER_OTLP_ENDPOINThttp://localhost:4317 torchrun --nproc_per_node8 pretrain_gpt.py ...把遥测指向 localhost 的 OTLP 端点——可以是 OpenTelemetry Collector也可以是直接接受 OTLP 的后端如 Jaeger。需要本地接收栈时可参考 lens 文档中关于把遥测发送到后端的说明。场景三生产环境 远程 Collectorexport MEGATRON_OTEL_ENABLED1 export MEGATRON_OTEL_SPAN_GROUPSdefault export OTEL_EXPORTER_OTLP_ENDPOINThttp://collector-host:4317 export OTEL_EXPORTER_OTLP_HEADERSAuthorizationBearer token python pretrain_gpt.py ...defaultspan 分组开销最低、适合生产Authorizationheader 用于远端鉴权如 Grafana Cloud、Honeycomb 等托管后端。场景四per-step 粒度 trace 采样export MEGATRON_OTEL_ENABLED1 export MEGATRON_OTEL_SPAN_GROUPSper_step export OTEL_TRACES_SAMPLERparentbased_traceidratio export OTEL_TRACES_SAMPLER_ARG0.1 # 只保留 10% 的 traceper_step提供每个训练迭代级的 span 细节配合parentbased_traceidratio以 0.1 的比例采样在细节与开销之间取得平衡——这是官方推荐的性能剖析组合。源码视角_set_telemetry()的完整处理流程把以上配置串联起来megatron/training/global_vars.py 中_set_telemetry()的完整流程是导入兜底尝试导入nemo.lens的NemoLensConfig与setup_telemetry失败则全局 handle 置None、直接返回遥测空操作不阻塞启动构造配置NemoLensConfig.from_env(prefixMEGATRON_OTEL, fallback_prefixNEMO_LENS, span_group_clsMegatronSpanGroup)从环境变量加载配置并注入 Megatron 自定义的 span 分组类MegatronSpanGroup定义在 megatron/core/telemetry/span_groups.py扩展了 lens 的基础分组新增microbatch、layer、communication、activation_offload、data_loading、first_iteration、trace_region、inference等分组CLI 覆盖依次应用--otel-enabled、--otel-service-name、--otel-span-groups的覆盖逻辑资源属性构建仅在启用状态下调用build_telemetry_resource_attrs()避免遥测关闭时的 NVML 开销初始化遥测setup_telemetry(config, rankargs.rank, world_sizeargs.world_size, resource_attributesresource_attrs)创建全局 handle可选日志桥接启用且可导出时建立 logging → OTel 的桥接。这套流程在训练初始化阶段由set_global_variables()调用megatron/training/global_vars.py与其他 loggerTensorBoard、WB、one_logger的初始化并列。配置进阶与 span 分组、指标体系的联动配置 OTel 不只是开关遥测还需要理解它与 span 粒度、指标命名空间的关系才能设计出高效的观测方案。span 粒度三档defaultjob/checkpoint/evaluate/inference开销最低、生产安全→per_step增加 model_init、load_checkpoint、step、forward_backward、optimizer、communication、data_loading建议配合采样→all包含 microbatch、layer、activation_offload 等最细粒度仅限开发/调试。每个 span 都挂有控制其是否发射的 span 组非导出 rank 的 span 组为frozenset()is_span_group_enabled()处处返回False根本不会创建 span 对象——关闭路径是一次 frozenset 查找后立即返回而非仍然分配对象的空操作 span。详见 Span Groups 文档。指标命名空间训练指标统一挂在megatron.training.*命名空间下如megatron.training.loss、megatron.training.step_duration_ms、megatron.training.throughput_tflops且只在导出 rank 上发射。这些指标与--log-interval同节奏与 TensorBoard/WB 日志保持一致。详见 Metrics 文档。数据定位指标每条数据点都携带nemo.run.id资源属性可在 Grafana 中用{nemo_run_idid, __name__~megatron_training_.*}过滤单个运行或用{nemo_run_id~run-a|run-b, __name__megatron_training_loss}对比两个运行。结语从开了遥测到可用的观测体系配置 Megatron-LM 的可观测性本质上是四层决策开关MEGATRON_OTEL_ENABLED--otel-enabled、粒度MEGATRON_OTEL_SPAN_GROUPS三档预设、范围MEGATRON_OTEL_RANK_STRATEGY决定谁导出、OTel SDK 采样器决定导出什么、归属NEMO_LENS_RUN_ID与资源属性让每次运行可检索、可对比。本文涉及的 CLI 参数、环境变量、资源属性与源码实现均已可在当前仓库中直接核对结合 observability 文档目录 中的 span 分组、指标、流水线并行关联与扩展指南可以搭建一套从单机调试到万卡级生产训练都适用的观测体系。【免费下载链接】Megatron-LMOngoing research training transformer models at scale项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表