下载
中文
注册

EJ0003打屏报错

问题现象

建链阶段报EJ0003的错误,HCCP调系统函数bind失败,常见报错error: 98error: 99

该报错对应Linux标准报错定义如下:

# define EADDRINUSE      98      /* Address already in use */
# define EADDRNOTAVAIL   99      /* Cannot assign requested address */

查看plog日志中关于HCCP的报错:

grep -rn ERROR * | grep HCCP | head

报错1:

plog/plog-3541138_20231113190511833.log:30551:[ERROR] HCCP(3541138,host_cpu_executor):2023-11-13-19:05:49.833.681 [rs_socket.c:671]tid:3541138,rs_socket_listen_bind_listen(671) : bind fail! family:2, IP:127.0.0.1, port:50000, sock:27, ret:0xffffffff, error:98, Possible Cause: the IP address and port have been bound already
plog/plog-3541138_20231113190511833.log:30552:[ERROR] HCCP(3541138,host_cpu_executor):2023-11-13-19:05:49.833.687 [rs_socket.c:860]tid:3541138,rs_socket_listen_start(860) : bind and listen fail, err_no:98, listen_fd:27, listen state:1, IP(127.0.0.1) server_port:50000
plog/plog-3541138_20231113190511833.log:30554:[ERROR] HCCP(3541138,host_cpu_executor):2023-11-13-19:05:49.833.704 [ra_peer.c:114]tid:3541138,ra_peer_socket_listen_start(114) : [listen_start][ra_peer_socket]ra listen start failed ret(-98).

报错2:

[ERROR] HCCP(160639,all_gather_test):2023-10-17-07:28:13.178.137 [rs_socket.c:671]tid:160639,rs_socket_listen_bind_listen(671) : bind fail! ::350d:755b:add4:ada6, port:60000, sock:25, ret:0xffffffff, error:99, Possible Cause: the IP address and port have been bound already

报错3:

75346:[ERROR] HCCP(13854,python3):2023-09-04-14:37:34.444.964 [rs_socket.c:1124]tid:21717,rs_connect_bind_client(1124) : client bind fail! IP:fe80::4b79:e6c9:31eb:f019, sock:530, ret:-1, error:99
75347:[ERROR] HCCP(13854,python3):2023-09-04-14:37:34.444.968 [rs_socket.c:1164]tid:21717,rs_socket_state_reset(1164) : rs_connect_bind_client failed, ret[-99]

原因分析

  • 配置错误。

    例如未配置网卡IP,或者网卡IP与业务配置IP不匹配,或者对一个IP地址及端口重复监听了多次。

  • Host侧未指定网卡建链,导致进程绑定IP地址报错。
  • 网卡状态异常。

解决方法

  1. 检查配置。
    • 查看Device网卡的IP地址是否存在。

      执行hccn_tool -i dev_id -ip -g命令查询对应的Device网卡的IP地址是否存在。

      若不存在,请执行如下命令进行配置。

      hccn_tool -i dev_id -ip -s address 192.168.0.3 netmask 255.255.255.0

    • 检查ranktable表中配置的IP地址与网卡实际IP是否一致,若不一致,请修改。

      说明:可以在Device日志中搜索关键字“listen fail”查看监听失败的IP地址

    • 检查应用程序端口与HCCL系统进程端口是否冲突。

      分布式训练场景下,HCCL默认会使用Host服务器的60000-60015端口收集集群信息,若通过环境变量HCCL_IF_BASE_PORT指定了Host网卡起始端口,则需要预留以该端口起始的16个端口。

      可通过lsof -i:60000确认占用端口的进程信息,通过netstat -ant | grep WAIT命令查看端口状态。

      若确认是应用程序端口与HCCL系统进程端口冲突,可通过如下命令预留系统端口。

      sysctl -w net.ipv4.ip_local_reserved_ports=60000-60015
    • 检查是否存在IP与端口重复监听的问题。

      设置日志级别为EVENT,然后在日志中grep -rn "socket bind" *,确认当前训练端口监听情况。

  2. 若绑定网卡报错,可通过环境变量HCCL_SOCKET_IFNAME指定初始化Host通信网卡,HCCL可通过该网卡名获取Host IP,完成通信域创建。
    配置示例如下:
    export HCCL_SOCKET_IFNAME==eth0
  3. 执行hccn_tool -i dev_id -link -g命令查看对应的Device网卡状态,若网卡状态异常,请排查网卡错误。