Skip to content

Conversation

@eric8607242
Copy link
Contributor

@eric8607242 eric8607242 commented Jan 6, 2023

#2361
Hi,
I try to dig into the root cause of this issue.
After digging, I found the reason to raise the checkpoint key missing issue for GPT2 is that in the ZeroDDP the state_dict of the model is dumped by the method self.named_parameters() which returns the output of the Pytorch named_parameters().

However, in the original implementation of named_parameters() in Pytorch, the named_parameters() only return the weights with the same memory address once.
This means that if there are two layers that share the same weight as the embedding layer and the final classifier layer in GPT2, the method named_parameters() would only return one of them.
But the original implementation of state_dict in Pytorch returns the whole state of the module instead.

Therefore, to address this issue, I create a dict named name_to_fp32_params to store the mapping between the whole module state and the fp32 params.

# Set keep_vars=True to prevent the parameter to be detached
for name, p in module.state_dict(keep_vars=True).items():
    if p in params_to_fp32_params[name] = params_to_fp32_params[p]
        self.name_to_fp32_params[name] = params_to_fp32_params[p]

And in the method _save_to_state_dict(), instead, utilize the function named_parameters(), I use the self.module.state_dict() to get the whole model state.

for name, p in self.module.state_dict().items():
    if p is not None and name in self.name_to_fp32_params:
        fp32_p = self.name_to_fp32_params[name]
    
        assert fp32_p in param_to_save_data, "Parameter '{}' is neglected in the chunk list".format(name)      
        record_parameter = param_to_save_data[fp32_p]
    else:
        record_parameter = p
    destination[prefix + name] = record_parameter

With the modification shown above, the state_dict can output the correct key value pair for the GPT2 without any impact on other models.

@feifeibear
Copy link
Contributor

Thanks @eric8607242 , very impressive.
Could you please solve the conflict? @1SAA please help review this PR.

@eric8607242
Copy link
Contributor Author

@feifeibear
Hi,
Thanks for the quick response!
The conflict fix done!

@1SAA
Copy link
Contributor

1SAA commented Jan 6, 2023

Hi @eric8607242

Thanks for your great PR. 😊
But we just added a powerful function called get_static_torch_model which can generate a torch model from a GeminiDDP module. You can find the function here. Could you try this function like
state_dict = get_static_torch_model(model).state_dict()?
Does this function meet your requirement? I think we could use this function to implement our new strict state_dict() funtion.

@eric8607242
Copy link
Contributor Author

eric8607242 commented Jan 6, 2023

Hi @1SAA ,
Thanks for the great work and awesome function.

I think this is exactly what I want!

But the new function is coupled with the ZeroDDP.state_dict.
Implementing the strict state_dict with the new function is a bit of a chicken-and-egg problem.
And I concern this may confuse other users as I did.

@1SAA
Copy link
Contributor

1SAA commented Jan 6, 2023

Hi @eric8607242

I think we can rename the current state_dict function as _non_strict_state_dict and write a new state_dict function based on get_static_torch_model. In my opinion, this way leads to minimum editions under the current circumstances.

@eric8607242
Copy link
Contributor Author

eric8607242 commented Jan 6, 2023

Hi @1SAA ,
I think this is a great idea.
Thanks for your suggestion!

I will follow this rule to modify the method as soon as possible.

@eric8607242
Copy link
Contributor Author

eric8607242 commented Jan 7, 2023

Hi @1SAA,
I rewrite the state_dict model with a new bool variable strict to specify which version ofstate_dict would be returned. The default value is True to return the state_dict as the Pytorch usage to avoid user confusion.

Look forward to your feedback.
Thanks!

@1SAA
Copy link
Contributor

1SAA commented Jan 9, 2023

Hi @eric8607242

LGTM.

@eric8607242
Copy link
Contributor Author

Hi @1SAA ,
Thanks for review!

I modify the argument GeminiDDP module to ZeroDDP module in get_static_torch_model function to be compatible with the lower version (v0.1.9 and v0.1.10).

@1SAA 1SAA merged commit 9880fd2 into hpcaitech:main Jan 9, 2023
Cypher30 added a commit that referenced this pull request Jan 27, 2023
* init

* rename and remove useless func

* basic chunk

* add evoformer

* align evoformer

* add meta

* basic chunk

* basic memory

* finish basic inference memory estimation

* finish memory estimation

* fix bug

* finish memory estimation

* add part of index tracer

* finish basic index tracer

* add doc string

* add doc str

* polish code

* polish code

* update active log

* polish code

* add possible region search

* finish region search loop

* finish chunk define

* support new op

* rename index tracer

* finishi codegen on msa

* redesign index tracer, add source and change compute

* pass outproduct mean

* code format

* code format

* work with outerproductmean and msa

* code style

* code style

* code style

* code style

* change threshold

* support check_index_duplicate

* support index dupilictae and update loop

* support output

* update memory estimate

* optimise search

* fix layernorm

* move flow tracer

* refactor flow tracer

* format code

* refactor flow search

* code style

* adapt codegen to prepose node

* code style

* remove abandoned function

* remove flow tracer

* code style

* code style

* reorder nodes

* finish node reorder

* update run

* code style

* add chunk select class

* add chunk select

* code style

* add chunksize in emit, fix bug in reassgin shape

* code style

* turn off print mem

* add evoformer openfold init

* init openfold

* add benchmark

* add print

* code style

* code style

* init openfold

* update openfold

* align openfold

* use max_mem to control stratge

* update source add

* add reorder in mem estimator

* improve reorder efficeincy

* support ones_like, add prompt if fit mode search fail

* fix a bug in ones like, dont gen chunk if dim size is 1

* fix bug again

* update min memory stratege, reduce mem usage by 30%

* last version of benchmark

* refactor structure

* restruct dir

* update test

* rename

* take apart chunk code gen

* close mem and code print

* code format

* rename ambiguous variable

* seperate flow tracer

* seperate input node dim search

* seperate prepose_nodes

* seperate non chunk input

* seperate reorder

* rename

* ad reorder graph

* seperate trace flow

* code style

* code style

* fix typo

* set benchmark

* rename test

* update codegen test

* Fix state_dict key missing issue of the ZeroDDP (#2363)

* Fix state_dict output for ZeroDDP duplicated parameters

* Rewrite state_dict based on get_static_torch_model

* Modify get_static_torch_model to be compatible with the lower version (ZeroDDP)

* update codegen test

* update codegen test

* add chunk search test

* code style

* add available

* [hotfix] fix gpt gemini example (#2404)

* [hotfix] fix gpt gemini example

* [example] add new assertions

* remove autochunk_available

* [workflow] added nightly release to pypi (#2403)

* add comments

* code style

* add doc for search chunk

* [doc] updated readme regarding pypi installation (#2406)

* add doc for search

* [doc] updated kernel-related optimisers' docstring (#2385)

* [doc] updated kernel-related optimisers' docstring

* polish doc

* rename trace_index to trace_indice

* rename function from index to indice

* rename

* rename in doc

* [polish] polish code for get_static_torch_model (#2405)

* [gemini] polish code

* [testing] remove code

* [gemini] make more robust

* rename

* rename

* remove useless function

* [worfklow] added coverage test (#2399)

* [worfklow] added coverage test

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* add doc for trace indice

* [docker] updated Dockerfile and release workflow (#2410)

* add doc

* update doc

* add available

* change imports

* add test in import

* [workflow] refactored the example check workflow (#2411)

* [workflow] refactored the example check workflow

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* Update parallel_context.py (#2408)

* [hotfix] add DISTPAN argument for benchmark (#2412)

* change the benchmark config file

* change config

* revert config file

* rename distpan to distplan

* [workflow] added precommit check for code consistency (#2401)

* [workflow] added precommit check for code consistency

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* polish code

* adapt new fx

* [workflow] added translation for non-english comments (#2414)

* [setup] refactored setup.py for dependency graph (#2413)

* change import

* update doc

* [workflow] auto comment if precommit check fails (#2417)

* [hotfix] add norm clearing for the overflow step (#2416)

* [examples] adding tflops to PaLM (#2365)

* [workflow]auto comment with test coverage report (#2419)

* [workflow]auto comment with test coverage report

* polish code

* polish yaml

* [doc] added documentation for CI/CD (#2420)

* [doc] added documentation for CI/CD

* polish markdown

* polish markdown

* polish markdown

* [example] removed duplicated stable diffusion example (#2424)

* [zero] add inference mode and its unit test (#2418)

* [workflow] report test coverage even if below threshold (#2431)

* [example] improved the clarity yof the example readme (#2427)

* [example] improved the clarity yof the example readme

* polish workflow

* polish workflow

* polish workflow

* polish workflow

* polish workflow

* polish workflow

* [ddp] add is_ddp_ignored (#2434)

[ddp] rename to is_ddp_ignored

* [workflow] make test coverage report collapsable (#2436)

* [autoparallel] add shard option (#2423)

* [fx] allow native ckpt trace and codegen. (#2438)

* [cli] provided more details if colossalai run fail (#2442)

* [autoparallel] integrate device mesh initialization into autoparallelize (#2393)

* [autoparallel] integrate device mesh initialization into autoparallelize

* add megatron solution

* update gpt autoparallel examples with latest api

* adapt beta value to fit the current computation cost

* [zero] fix state_dict and load_state_dict for ddp ignored parameters (#2443)

* [ddp] add is_ddp_ignored

[ddp] rename to is_ddp_ignored

* [zero] fix state_dict and load_state_dict

* fix bugs

* [zero] update unit test for ZeroDDP

* [example] updated the hybrid parallel tutorial (#2444)

* [example] updated the hybrid parallel tutorial

* polish code

* [zero] add warning for ignored parameters (#2446)

* [example] updated large-batch optimizer tutorial (#2448)

* [example] updated large-batch optimizer tutorial

* polish code

* polish code

* [example] fixed seed error in train_dreambooth_colossalai.py (#2445)

* [workflow] fixed the on-merge condition check (#2452)

* [workflow] automated the compatiblity test (#2453)

* [workflow] automated the compatiblity test

* polish code

* [autoparallel] update binary elementwise handler (#2451)

* [autoparallel] update binary elementwise handler

* polish

* [workflow] automated bdist wheel build (#2459)

* [workflow] automated bdist wheel build

* polish workflow

* polish readme

* polish readme

* Fix False warning in initialize.py (#2456)

* Update initialize.py

* pre-commit run check

* [examples] update autoparallel tutorial demo (#2449)

* [examples] update autoparallel tutorial demo

* add test_ci.sh

* polish

* add conda yaml

* [cli] fixed hostname mismatch error (#2465)

* [example] integrate autoparallel demo with CI (#2466)

* [example] integrate autoparallel demo with CI

* polish code

* polish code

* polish code

* polish code

* [zero] low level optim supports ProcessGroup (#2464)

* [example] update vit ci script (#2469)

* [example] update vit ci script

* [example] update requirements

* [example] update requirements

* [example] integrate seq-parallel tutorial with CI (#2463)

* [zero] polish low level optimizer (#2473)

* polish pp middleware (#2476)

Co-authored-by: Ziyue Jiang <[email protected]>

* [example] update gpt gemini example ci test (#2477)

* [zero] add unit test for low-level zero init (#2474)

* [workflow] fixed the skip condition of  example weekly check workflow (#2481)

* [example] stable diffusion add roadmap

* add dummy test_ci.sh

* [example] stable diffusion add roadmap (#2482)

* [CI] add test_ci.sh for palm, opt and gpt (#2475)

* polish code

* [example] titans for gpt

* polish readme

* remove license

* polish code

* update readme

* [example] titans for gpt (#2484)

* [autoparallel] support origin activation ckpt on autoprallel system (#2468)

* [autochunk] support evoformer tracer (#2485)

support full evoformer tracer, which is a main module of alphafold. previously we just support a simplifed version of it.
1. support some evoformer's op in fx
2. support evoformer test
3. add repos for test code

* [example] fix requirements (#2488)

* [zero] add unit testings for hybrid parallelism  (#2486)

* [hotfix] gpt example titans bug #2493

* polish code and fix dataloader bugs

* [hotfix] gpt example titans bug #2493 (#2494)

* [fx] allow control of ckpt_codegen init (#2498)

* [fx] allow control of ckpt_codegen init

Currently in ColoGraphModule, ActivationCheckpointCodeGen will be set automatically in __init__. But other codegen can't be set if so. 
So I add an arg to control whether to set ActivationCheckpointCodeGen in __init__.

* code style

* [example] dreambooth example

* add test_ci.sh to dreambooth

* [autochunk] support autochunk on evoformer (#2497)

* Revert "Update parallel_context.py (#2408)"

This reverts commit 7d5640b.

* add avg partition (#2483)

Co-authored-by: Ziyue Jiang <[email protected]>

* [auto-chunk] support extramsa (#3) (#2504)

* [utils] lazy init. (#2148)

* [utils] lazy init.

* [utils] remove description.

* [utils] complete.

* [utils] finalize.

* [utils] fix names.

* [autochunk] support parsing blocks (#2506)

* [zero] add strict ddp mode (#2508)

* [zero] add strict ddp mode

* [polish] add comments for strict ddp mode

* [zero] fix test error

* [doc] update opt and tutorial links (#2509)

* [workflow] fixed changed file detection (#2515)

Co-authored-by: oahzxl <[email protected]>
Co-authored-by: eric8607242 <[email protected]>
Co-authored-by: HELSON <[email protected]>
Co-authored-by: Frank Lee <[email protected]>
Co-authored-by: Haofan Wang <[email protected]>
Co-authored-by: Jiarui Fang <[email protected]>
Co-authored-by: ZijianYY <[email protected]>
Co-authored-by: YuliangLiu0306 <[email protected]>
Co-authored-by: Super Daniel <[email protected]>
Co-authored-by: ver217 <[email protected]>
Co-authored-by: Ziyue Jiang <[email protected]>
Co-authored-by: Ziyue Jiang <[email protected]>
Co-authored-by: oahzxl <[email protected]>
Co-authored-by: binmakeswell <[email protected]>
Co-authored-by: Fazzie-Maqianli <[email protected]>
Co-authored-by: アマデウス <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants