Refactor megatron apex guard
State: closed | Pull request: yes

Starting of a nemo:1.5.0 container and using `./reinstall.sh` to upgrade to nemo:1.6.0rc0 the `import nemo.collections.nlp` will crash:
```
Python 3.8.12 | packaged by conda-forge | (default, Sep 29 2021, 19:52:28) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import nemo.collections.nlp
NOTE! Installing ujson may make loading annotations faster.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/workspace/nemo2/nemo/collections/nlp/__init__.py", line 15, in <module>
    from nemo.collections.nlp import data, losses, models, modules
  File "/workspace/nemo2/nemo/collections/nlp/models/__init__.py", line 15, in <module>
    from nemo.collections.nlp.models.dialogue_state_tracking.sgdqa_model import SGDQAModel
  File "/workspace/nemo2/nemo/collections/nlp/models/dialogue_state_tracking/__init__.py", line 15, in <module>
    from nemo.collections.nlp.models.dialogue_state_tracking.sgdqa_model import SGDQAModel
  File "/workspace/nemo2/nemo/collections/nlp/models/dialogue_state_tracking/sgdqa_model.py", line 33, in <module>
    from nemo.collections.nlp.models.nlp_model import NLPModel
  File "/workspace/nemo2/nemo/collections/nlp/models/nlp_model.py", line 29, in <module>
    from nemo.collections.nlp.modules import BertModule
  File "/workspace/nemo2/nemo/collections/nlp/modules/__init__.py", line 16, in <module>
    from nemo.collections.nlp.modules.common import (
  File "/workspace/nemo2/nemo/collections/nlp/modules/common/__init__.py", line 29, in <module>
    from nemo.collections.nlp.modules.common.tokenizer_utils import get_tokenizer, get_tokenizer_list
  File "/workspace/nemo2/nemo/collections/nlp/modules/common/tokenizer_utils.py", line 27, in <module>
    from nemo.collections.nlp.parts.nlp_overrides import HAVE_APEX
  File "/workspace/nemo2/nemo/collections/nlp/parts/nlp_overrides.py", line 33, in <module>
    from nemo.collections.nlp.modules.common.megatron.module import Float16Module
  File "/workspace/nemo2/nemo/collections/nlp/modules/common/megatron/__init__.py", line 15, in <module>
    from nemo.collections.nlp.modules.common.megatron.megatron_bert import MegatronBertEncoder
  File "/workspace/nemo2/nemo/collections/nlp/modules/common/megatron/megatron_bert.py", line 30, in <module>
    from nemo.collections.nlp.modules.common.megatron.language_model import get_language_model
  File "/workspace/nemo2/nemo/collections/nlp/modules/common/megatron/language_model.py", line 26, in <module>
    from nemo.collections.nlp.modules.common.megatron.transformer import ParallelTransformer
  File "/workspace/nemo2/nemo/collections/nlp/modules/common/megatron/transformer.py", line 24, in <module>
    from apex.transformer.utils import divide as safe_divide
ModuleNotFoundError: No module named 'apex.transformer.utils'
```

It turns out, that apex is preinstalled in nemo:1.5.0, but version 0.1, hence some of the previous `HAVE_APEX` checks will fail some not. Since `apex.transformer.utils` is present only in a recent version of apex, I have added `nemo.utils.apex_check.is_megatron_supported` to check first if apex is installed and if it is recent.

Signed-off-by: Iztok Lebar Bajec <ilb@fri.uni-lj.si>