-
Notifications
You must be signed in to change notification settings - Fork 4k
[ROCm] add support for ROCm/HIP device #6086
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- CMakeLists.txt ROCm updates, also replace glob with explicit file list - initial warpSize interop changes - helpers/hipify.sh script added - .gitignore to ignore generated hip source files
- disable compiler warnings - move PercentileDevice __device__ template function into header - bug fixes for __host__ __define__ and __HIP__ preprocessor symbols
jameslamb
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for your interest in LightGBM. Since I'm not aware of any prior conversation in this project about adding support like this, we have some questions before spending time supporting this.
- what is ROCm/HIP? Where can we read to learn more?
- what is the value of this addition to LightGBM's users? What does this offer that the OpenCL-based and CUDA-based builds of LightGBM don't already offer?
- this project's OpenCL-based GPU build is already struggling from a severe lack of maintenance... I'm very skeptical of taking on a third GPU build
- how might we test this? What types of devices should we expect to be supported?
|
@jeffdaily Thank you, this is very exciting! @jameslamb ROCm is the counterpart of CUDA for AMD GPU. I don't have any prior discussion with @jeffdaily about this. But it is very exciting if we can enlarge the devices supported by LightGBM. |
|
Apologies for coming out of nowhere with this. We use LightGBM; the OpenCL-based 'gpu' device already works on our AMD GPUs. But we were curious if we could get better performance if we ported the 'cuda' device to AMD GPUs. This started as a proof of concept, but it seemed useful to share even in its current state. Using the GPU-Tutorial, here are my results on our MI210.
|
https://rocm.docs.amd.com/en/latest/rocm.html
See the perf results from the comment above.
Here is the current list of supported AMD GPUs. To test this, you'll need to run on one of the supported AMD GPUs. How is the cuda device currently tested? |
|
Thank you and kudos Jeff! |
We run a VM in Azure with a Tesla V100 on it, and schedule jobs onto it via GitHub Actions.
Are you aware of any free CI service supporting AMD GPUs? Otherwise, since I see you work for AMD and since merging this might further AMD's interests... would AMD maybe be willing to fund testing resources for this project? Maybe that's something you and @shiyu1994 (the only maintainer here who's employed by Microsoft) could coordinate? |
Microsoft does have an AMD GPU deployment. I'm aware of it being used for onnxruntime CI purposes. I wonder if some of those resources could be used here? @shiyu1994? |
|
Noting that the only CI failure currently is not related to my changes. It seems to be a perhaps temporary environment setup issue for that job. |
|
I have access to some AMD MI100 GPUs. But we still need separate budget for an agent with an AMD GPU if we want to test automatically in ci. Do you think it is acceptable if I run the tests for AMD GPU offline without an additional agent for ci? Given that the code for GPU version is shared by both CUDA and ROCm. @jameslamb @guolinke @jeffdaily. |
If you feel confident in these changes based on that, and you think the added complexity in the CUDA code is worth it, that's fine with me. I'll defer to your opinion. But without a CI job, there's a high risk that future refactorings will break this support again. |
|
I dismissed my review, so that it doesn't block merging. My initial questions have been answered, thanks very much for those links and all that information! @shiyu1994 and @guolinke seem excited about this addition... that's good enough for me 😊 I'll defer to them to review the code, as I know very little about CUDA. |
|
@jeffdaily Thanks for the great work! I'll review this in the next few days. |
StrikerRUS
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@shiyu1994 Thank you for considering my comments! I think that two of them were not addressed by your recent refactoring. Please check #6086 (comment) and #6086 (comment).
Thank you for the very careful check. I've done the fixes in 28d4648. Could you please review it again? @StrikerRUS |
StrikerRUS
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| __shared__ double shared_rho[SHARED_MEMORY_SIZE]; | ||
| // assert that warpSize == 32 | ||
| __shared__ double shared_buffer[32]; | ||
| __shared__ double shared_buffer[WARPSIZE]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess it should be 1024 / WARPSIZE similarly to L530 in this file.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done via d4676d9.
Please check.
Thanks for the finding!
|
@StrikerRUS Thanks for your review. Could you please check this PR again? If there's no other problems, let's merge this. |
|
/AzurePipelines run |
StrikerRUS
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jeffdaily Thank you so much for proposing this PR!
And thanks a lot @shiyu1994 for finishing it!
|
@jameslamb Could you please refresh your blocking review? |
|
Kindly ping @jameslamb for unblocking the merge of this PR |
|
Sorry for the delay, I will try to look tonight (about 8 hours from now in my timezone). Has the most recent version of this PR been tested on a machine with an AMD GPU? I know @shiyu1994 had mentioned doing that (#6086 (comment)) but I don't see any comments on this PR saying that anyone has tested this. My plan for reviewing was to provision a machine from AWS with an AMD GPU and try cloning this branch, building, and testing. I am OK merging this without CI set up (as it seems that it will be difficult to do that), to make it easier for other people to test... but we should at least see the latest version build and pass tests manually once before this is merged. |
|
I'm very sorry, I haven't been able to test this and won't be able to for a while. I've removed my blocking review so @StrikerRUS you can merge this if you are confident enough in it. Sorry for delaying this. |
|
@jameslamb No problem at all! |
|
Sorry, I merged this before reading the above comments... |
|
Ok thanks, yes please. It would be good to check that it at least minimally works before releasing. Otherwise I think it's very likely to be broken by future development. |
|
@jeffdaily Thank a lot for the provided link! I registered there but unfortunately I'm not able to add funds to my account from Russia. Maybe someone else will be able to do this or we may try to reuse any AMD runner from another Microsoft open-source project. |
Previously microsoft#6086 added ROCm support but after numerous rebases it lost critical changes. This PR restores the ROCm build. There are many source file changes but most were automated using the following: ```bash for f in `grep -rl '#ifdef USE_CUDA'` do sed -i 's@#ifdef USE_CUDA@#if defined(USE_CUDA) || defined(USE_ROCM)@g' $f done for f in `grep -rl '#endif // USE_CUDA'` do sed -i 's@#endif // USE_CUDA@#endif // USE_CUDA || USE_ROCM@g' $f done ```
To build for ROCm:
CUDA source files are hipified in-place using the helper script before running cmake. The "cuda" device is re-used for rocm, so device=cuda will work the same for rocm builds.
Summary of changes:
__device__template function PercentileDevice into header__host__ __define__