ml-explore / ml-explore/mlx

[BUG] GPU locking using METAL_FAST_SYNCH=1 and the JACCL backend

Open
#3,142 8 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug distributed wontfix
Dominant language
C++
Stars
28.5k
Forks
2.3k
Avg merge
3d 8h
Merged PRs (30d)
62

Description

Describe the bug
In certain occasions, the GPU gets stuck in the while(1) loop in fence_wait and can never escape, leaving the GPU "locked" at 100% usage until the machine is restarted.

We've looked into the issue for a while and can't seem to pin down the specific cause. It seems as though, from my investigation, that the GPU in fence_wait does not see the timestamp when it is updated by the CPU. It may be a timing issue or some sort of coherence issue.

To Reproduce
This is fairly difficult to reproduce (happens non-deterministically as far as I can tell). The most consistent way I have found is to run two large models in parallel using RDMA. It is also more likely on 4 nodes vs 2.

The context that we encounter this issue is as follows:

  • Using the standard stream_generate with either a tensor/pipeline sharded model in Exo, we see this issue occasionally.
  • I would like to see if this occurs in MLX LM, but I have not gotten around to this.

Additional context
#3141 attempts to resolve this, and the number of GPU locks seems to be drastically reduced. However, this is not an exhaustive fix at the very least.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by inspecting the fence_wait loop and the behavior of METAL_FAST_SYNCH=1 with the JACCL backend. Review #3141 and compare runs with parallel large models over RDMA on two and four nodes, using Exo's standard stream_generate path where possible. Done means identifying the cause of the GPU lock and demonstrating that the lock no longer occurs in the reported scenarios.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
distributed-systems, machine-learning, performance
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.