Optimize distributed_fused_adam memory usage & speed
# What does this PR do ?

The optimizer `apex.distributed_fused_adam` is a high-performance adam optimizer implementation. It provides a bucket function to update the gradient aggregation to improve performance. However, bad bucket configuration can lead to GB-level memory loss. This PR realizes the automatic search for the optimal bucket size for GPT model, maximizing the bucket size while minimizing memory loss, thereby maintaining excellent optimizer performance.

**Collection**: NLP

# Changelog 
- add bucket_cap_mb automatic search function
- add unit test

# Usage

When using distributed_fused_adam, you can configure bucket_cap_mb to auto to enable this function.

```yaml
...
  optim:
    name: distributed_fused_adam
    lr: 0.0001
    weight_decay: 0.1
    betas:
    - 0.9
    - 0.95
    bucket_cap_mb: auto
    overlap_grad_sync: true
    overlap_param_sync: true
    contiguous_grad_buffer: true
    sched:
      name: CosineAnnealing
      warmup_steps: 107
      constant_steps: 11873
      min_lr: 1.0e-05
...
```

# Before your PR is "Ready for review"
**Pre checks**:
- [x] Make sure you read and followed [Contributor guidelines](https://github.com/NVIDIA/NeMo/blob/main/CONTRIBUTING.md)
- [x] Did you write any new necessary tests?
- [x] Did you add or update any necessary documentation?
- [ ] Does the PR affect components that are optional to install? (Ex: Numba, Pynini, Apex etc)
  - [ ] Reviewer: Does the PR have correct import guards for all optional libraries?
  
**PR Type**:
- [x] New Feature
- [ ] Bugfix
- [ ] Documentation

If you haven't finished some of the above items you can still open "Draft" PR.


## Who can review?

Help me review this PR, thank you! @MaximumEntropy, @ericharper, @ekmb, @yzhang123, @VahidooX, @vladgets, @okuchaiev

