Neo4j GraphSage训练无日志输出及大规模图训练时长问题咨询
当前训练任务的基础信息如下:
- 训练算法:GraphSage,用于提取图嵌入
- 图规模:共82,339,589个节点、219,521,164条边
- 运行状态:已启动6天仍在运行,执行
:queries命令可查询到任务状态正常 - 已获取的最新日志内容:
2021-12-01 12:03:16.267+0000 INFO Relationship Store Scan (RelationshipScanCursorBasedScanner): Imported 352,492,468 records and 0 properties from 16247 MiB (17,036,668,320 bytes); took 59.057 s, 5,968,663.57 Relationships/s, 275 MiB/s (288,477,487 bytes/s) (per thread: 1,492,165.89 Relationships/s, 68 MiB/s (72,119,371 bytes/s))
2021-12-01 12:03:16.269+0000 INFO [neo4j.BoltWorker-3 [bolt] [/10.0.0.6:56143] ] LOADING
INFO [neo4j.BoltWorker-3 [bolt] [/10.0.0.6:56143] ] LOADING Actual memory usage of the loaded graph: 8602 MiB
INFO [neo4j.BoltWorker-3 [bolt] [/10.0.0.6:64076] ] GraphSageTrain :: Start
针对你使用的Neo4j GDS库GraphSage实现,可通过以下三种方式获取更详细的运行信息:
- 调整日志输出级别:修改neo4j.conf配置文件中的
gds.loglevel参数,将默认的INFO调整为DEBUG或TRACE,重启Neo4j实例后即可输出每轮训练的损失值、批次处理进度、采样执行明细等信息。注意DEBUG及以上级别会生成大量日志,操作前请确保磁盘存储空间充足。 - 调用内置进度查询接口:无需修改配置,直接执行Cypher命令
CALL gds.listProgress()即可获取所有运行中GDS任务的实时进度、已执行时长、剩余预估时长,GraphSage训练任务还会返回当前已完成的训练轮次信息。 - 获取Docker全量日志:默认
docker logs xxx仅输出截断后的标准流内容,可添加参数执行docker logs --timestamps --follow <容器ID>实时追踪日志输出,也可执行docker logs --since 6d <容器ID>查看过去6天的全量日志,排查训练过程中是否存在异常报错。
该耗时是否合理需结合你的硬件配置、训练参数共同判断,参考判定标准如下:
- 符合正常情况的场景:若你使用单CPU/单GPU训练,GraphSage层数≥3、每层邻居采样数≥25、训练轮次≥30、嵌入维度≥256,8千万节点、2亿边规模的图训练耗时在3-10天区间都属于合理范围。
- 需排查异常的场景:若你使用多卡分布式训练,且训练参数规模较小(如2层网络、每层采样10个邻居、训练轮次≤10),6天仍未完成则属于异常。可先通过
gds.listProgress()查询确认任务是否处于正常运行状态,排查是否存在内存溢出死锁、IO阻塞等问题。
内容的提问来源于stack exchange,提问作者ugurtosun

