Detectron: Auf einer 4-GB-Karte ist kein Speicher mehr vorhanden

Erstellt am 24. Jan. 2018  ·  24Kommentare  ·  Quelle: facebookresearch/Detectron

Ich versuche Faster-RCNN auf einer Nvidia GTX 1050Ti auszuführen, aber mir geht der Speicher aus. Nvidia-smi sagt, dass ungefähr 170 MB bereits verwendet werden, aber verwendet Faster-RCNN wirklich 3,8 GB VRAM, um ein Bild zu verarbeiten?

Ich habe auch Mask-RCNN ausprobiert (das Modell im Tutorial für die ersten Schritte) und ungefähr 4 Bilder erhalten (5, wenn ich meinen Browser geschlossen habe), bevor es abstürzte.

Ist das ein Fehler oder braucht es wirklich nur mehr als 4 GB Speicher?

INFO infer_simple.py: 111: Processing demo/18124840932_e42b3e377c_k.jpg -> /home/px046/prog/Detectron/output/18124840932_e42b3e377c_k.jpg.pdf
terminate called after throwing an instance of 'caffe2::EnforceNotMet'
  what():  [enforce fail at blob.h:94] IsType<T>(). wrong type for the Blob instance. Blob contains nullptr (uninitialized) while caller expects caffe2::Tensor<caffe2::CUDAContext> .
Offending Blob name: gpu_0/conv_rpn_w.
Error from operator: 
input: "gpu_0/res4_5_sum" input: "gpu_0/conv_rpn_w" input: "gpu_0/conv_rpn_b" output: "gpu_0/conv_rpn" name: "" type: "Conv" arg { name: "kernel" i: 3 } arg { name: "exhaustive_search" i: 0 } arg { name: "pad" i: 1 } arg { name: "order" s: "NCHW" } arg { name: "stride" i: 1 } device_option { device_type: 1 cuda_gpu_id: 0 } engine: "CUDNN"
*** Aborted at 1516787658 (unix time) try "date -d @1516787658" if you are using GNU date ***
PC: @     0x7f08de455428 gsignal
*** SIGABRT (@0x3e800000932) received by PID 2354 (TID 0x7f087cda9700) from PID 2354; stack trace: ***
    @     0x7f08de4554b0 (unknown)
    @     0x7f08de455428 gsignal
    @     0x7f08de45702a abort
    @     0x7f08d187db39 __gnu_cxx::__verbose_terminate_handler()
    @     0x7f08d187c1fb __cxxabiv1::__terminate()
    @     0x7f08d187c234 std::terminate()
    @     0x7f08d1897c8a execute_native_thread_routine_compat
    @     0x7f08def016ba start_thread
    @     0x7f08de52741d clone
    @                0x0 (unknown)
Aborted (core dumped)

enhancement

Hilfreichster Kommentar

Ein zusätzlicher Hinweis: Die aktuelle Implementierung verwendet Speicheroptimierungen während des Trainings, aber nicht während der Inferenz. Im Falle einer Inferenz ist es möglich, den Speicherverbrauch erheblich zu reduzieren, da keine Zwischenaktivierungen erforderlich sind, sobald sie verbraucht sind. Wir werden erwägen, in Zukunft eine reine Inferenz-Speicheroptimierung hinzuzufügen.

Alle 24 Kommentare

Hallo @Omegastick , die Speicheranforderungen des Faster R-CNN-Algorithmus variieren in Abhängigkeit von einer Reihe von Faktoren, einschließlich der Backbone-Netzwerkarchitektur und der verwendeten Testbildskalen.

Sie können beispielsweise Faster R-CNN mit der Standardkonfiguration von ResNet-50 ausführen, indem Sie Folgendes verwenden:

python2 tools/infer_simple.py \
  --cfg configs/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml \
  --output-dir /tmp/detectron-visualizations \ 
  --image-ext jpg \
  --wts https://s3-us-west-2.amazonaws.com/detectron/35857389/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml.01_37_22.KSeq0b5q/output/train/coco_2014_train%3Acoco_2014_valminusminival/generalized_rcnn/model_final.pkl \
  demo

die nicht mehr als 3 GB benötigen sollten, um auf den Demo-Images ausgeführt zu werden.

Ein zusätzlicher Hinweis: Die aktuelle Implementierung verwendet Speicheroptimierungen während des Trainings, aber nicht während der Inferenz. Im Falle einer Inferenz ist es möglich, den Speicherverbrauch erheblich zu reduzieren, da keine Zwischenaktivierungen erforderlich sind, sobald sie verbraucht sind. Wir werden erwägen, in Zukunft eine reine Inferenz-Speicheroptimierung hinzuzufügen.

@Omegastick Auf meinem

@ ir413 Danke, das von Ihnen verlinkte Modell funktioniert auf meinem Computer hervorragend (mit 2,5 GB VRAM-Auslastung).

Es wäre cool, wenn Inferenz überhaupt keine GPU benötigen würde.

Wie kann ich mask-rcnn mit einer 2G-Speicher-GPU ausführen? Kann mir jemand helfen ?

Liegt dieses Problem an der Implementierung von Caffe 2 oder Detectron? Welche Dateien in Detectron sollte ich mir ansehen, um dieses Problem zu lösen?

@rbgirshick

Im Falle einer Inferenz ist es möglich, den Speicherverbrauch erheblich zu reduzieren, da keine Zwischenaktivierungen erforderlich sind, sobald sie verbraucht sind. Wir werden erwägen, in Zukunft eine reine Inferenz-Speicheroptimierung hinzuzufügen.

Ist in PyTorch/Caffe2 schon etwas implementiert? Wenn ja, wo müssen wir graben?

@gadcam Das steht schon lange auf meiner Todo-Liste, aber leider hat seine Priorität caffe2.python.memonger.release_blobs_when_used (https://github.com/pytorch/pytorch/blob/master/caffe2/python/memonger.py#L229) das meiste von dem implementieren sollte, was wir brauchen. Es gibt jedoch einige nicht triviale Probleme, die angegangen werden müssen:

  • Für einige Netze (zB Mask R-CNN) werden mehrere Netze zur Inferenzzeit verwendet und daher können nicht alle Aktivierungen durch Überlegung über nur einen Graphen freigegeben werden (weil sie von einem anderen Graphen benötigt werden, zB dem Maskenkopfnetz).
  • Diese Funktion erfordert die Verwendung eines Caching-Speichermanagers, den wir nicht getestet haben, daher kann es beim einfachen Einschalten zu Problemen kommen.

@rbgirshick Danke für deine ausführliche Erklärung!

So wie ich es verstehe, fungiert release_blobs_when_used für uns als Konverter von einem normalen Proto zu einem "speicheroptimierten".

Für einige Netze (zB Mask R-CNN) werden mehrere Netze zur Inferenzzeit verwendet und daher können nicht alle Aktivierungen durch Überlegung über nur einen Graphen freigegeben werden (weil sie von einem anderen Graphen benötigt werden, zB dem Maskenkopfnetz).

Mit anderen Worten, wir müssen dont_free_blobs mit Blobs füllen, die von der zweiten Stufe verwendet werden?

Diese Funktion erfordert die Verwendung eines Caching-Speichermanagers, den wir nicht getestet haben, daher kann es beim einfachen Einschalten zu Problemen kommen.

Wenn wir es also testen wollen, müssten wir FLAGS_caffe2_cuda_memory_pool auf cub (oder thc ) setzen, aber könnten wir dies in Python tun?
Einer der sehr seltenen Verweise darauf, die ich finden konnte, ist hier https://github.com/pytorch/pytorch/blob/6223bfdb1d3273a57b58b2a04c25c6114eaf3911/caffe2/core/context_gpu.cu#L190

@gadcam

So wie ich es verstehe, fungiert release_blobs_when_used für uns als Konverter von einem normalen Proto zu einem "speicheroptimierten".

Ja das ist richtig. Es analysiert den Berechnungsgraphen, bestimmt, wann jedes Blob nicht mehr verwendet wird, und fügt dann eine speicherbefreiende Operation ein.

Mit anderen Worten, wir müssen dont_free_blobs mit Blobs füllen, die von der zweiten Stufe verwendet werden?

Ja, mit dem Vorbehalt, dass ich nicht sicher bin, wie gut diese Funktion verwendet und / oder getestet wird ... aus dem Grepping-Code scheint es, dass sie nicht wirklich verwendet wird. Daher würde ich bedenken, dass es möglicherweise nicht wie erwartet funktioniert.

Wenn wir es also testen möchten, müssten wir FLAGS_caffe2_cuda_memory_pool auf cub (oder thc) setzen, aber könnten wir dies in Python tun?

Jawohl. Ich denke, der neu hinzugefügte Speichermanager thc ist effizienter. Wir mussten es anstelle von cub für einen aktuellen (wenn auch anderen) Anwendungsfall verwenden.

@rbgirshick Du hast Recht, es sieht nach einem riskanten Weg aus!

Jawohl. Ich denke, der neu hinzugefügte Speichermanager ist effizienter. Wir mussten es anstelle von cub für einen aktuellen (wenn auch anderen) Anwendungsfall verwenden.

Was ich meinte ist, weißt du wo ich Unterlagen dazu finden kann oder hast du ein Beispiel? (Es tut mir wirklich leid, darauf zu bestehen, vielleicht habe ich etwas übersehen, aber ich konnte keine Dokumentation dazu finden)

@gadcam in Bezug auf die Dokumentation, die mir nicht bekannt ist. Es tut uns leid!

@asaadaldien Es tut mir wirklich leid, dich zu ärgern, aber du

STELLEN SIE SICHER, dass caffe2_cuda_memory_pool eingestellt ist

wenn wir memonger oder data_parallel_model verwenden (als Referenz war es hier ).
Haben Sie einen Hinweis, wie Sie sicherstellen können, dass ein Cache-Speichermanager aktiviert ist? (Mit Caffe2 in Python)

@gadcam Sie können den zwischengespeicherten Cub-Zuordner aktivieren,

workspace.GlobalInit([
'--caffe2_cuda_memory_pool=cub',
])

Dies ist jedoch nur bei Verwendung dynamischer Speicher erforderlich.

@asaadaldien
Ich hätte viel Zeit gebraucht, um herauszufinden, wie das geht, da es keine Dokumentation zu GlobalInit .
Vielen Dank für Ihre Hilfe! So, jetzt kann ich mit einigen Experimenten beginnen!

Ich habe eine einfache Lösung für dieses Problem.
Sie könnten 'P2~P5' und 'rois' als Ausgabe-Blobs einstellen, nicht nur den mittleren Blob, dann wird er bei der Speicheroptimierung nicht optimiert.

Scheint bei mir nicht zu funktionieren.
Das von mir getestete Modell ist e2e_keypoint_rcnn_R-50-FPN_s1x.yaml .
Ich habe versucht, es mit dem model.net Teil zu testen.

Ich habe infer_simple.py für die Tests verwendet.

workspace.GlobalInit(['caffe2', '--caffe2_log_level=0', '--caffe2_cuda_memory_pool=thc']) 

und

dont_free_blobs = set(model.net.Proto().external_output)
expect_frees = set(i for op in model.net.Proto().op for i in op.input)
expect_frees -= dont_free_blobs

opti_net = release_blobs_when_used(model.net.Proto(), dont_free_blobs, selector_fun=None)
model.net.Proto().op.extend(copy.deepcopy(opti_net.op))

test_release_blobs_when_used(model.net.Proto(), expect_frees) 

wobei test_release_blobs_when_used inspiriert ist von https://github.com/pytorch/pytorch/blob/bf58bb5e59fa64fb49d77467f3466c6bc0cc76c5/caffe2/python/memonger_test.py#L731

def test_release_blobs_when_used(with_frees, expect_frees):
    found_frees = set()
    for op in with_frees.op:
        if op.type == "Free":
            print("OP FREEE", op)
            assert(not op.input[0] in found_frees)  # no double frees
            found_frees.add(op.input[0])
        else:
            # Check a freed blob is not used anymore
            for inp in op.input:
                assert(not inp in found_frees)
            for outp in op.output:
                assert(not outp in found_frees)

    try:
        assert(expect_frees == found_frees)
    except:
        print("Found - Expect frees Nb=", len(found_frees - expect_frees), found_frees - expect_frees, "\n\n\n")
        print("Expect - Found frees Nb=", len(expect_frees - found_frees), expect_frees - found_frees, "\n\n\n")
       #assert(False)

Bitte beachten Sie, dass dont_free_blobs nicht auf den richtigen Wert gesetzt ist!

Diese Funktion sagt mir, dass kein unerwarteter Blob freigegeben wird und einige fehlen.
(was normal ist, weil dont_free_blobs nicht korrekt ist)
Also betreibe ich das Modell weiter.

Und... nichts passiert. Ich habe es mit der Funktion save_graph überprüft: Die kostenlosen Ops sind tatsächlich hier am richtigen Ort.

Der Speicherverbrauch für meine Sample-Eingänge dieser Zeile beträgt 1910 Mo +/- 5 Mo
https://github.com/facebookresearch/Detectron/blob/6c5835862888e784e861824e0ad6ac93dd01d8f5/detectron/core/test.py#L158

Aber etwas wirklich Überraschendes passiert, wenn ich den Speichermanager auf CUB stelle

workspace.GlobalInit(['caffe2', '--caffe2_log_level=0', '--caffe2_cuda_memory_pool=cub']) 

Die RAM-Auslastung der Zeile RunNet wird um etwa 3 Go erhöht!! (mit dem regulären Code oder dem benutzerdefinierten mit den kostenlosen Blobs)

Ich verstehe nicht was los ist...

Wie in #507 beschrieben, tritt beim Starten der Inferenz auf Jetson TX1 auch ein Fehler wegen unzureichendem Speicher auf.
Die in diesem Thread beschriebene Lösung, wie:
python2 tools/infer_simple.py \ --cfg configs/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml \ --output-dir /tmp/detectron-visualizations \ --image-ext jpg \ --wts https://s3-us-west-2.amazonaws.com/detectron/35857389/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml.01_37_22.KSeq0b5q/output/train/coco_2014_train%3Acoco_2014_valminusminival/generalized_rcnn/model_final.pkl \ demo
Funktioniert auch nicht, mir geht immer noch der Speicher aus, obwohl ich insgesamt 4 GB RAM zur Verfügung habe (obwohl CPU und GPU Speicher geteilt werden).
Gibt es noch ein kleineres Modell, das ich ausprobieren könnte?
Denn wie von beanspruchen , aber es scheint immer noch nicht auf den Jetson zu passen. Irgendwelche anderen Vorschläge, die ich versuchen könnte?

@johannathiemich Ich habe das gleiche Problem. Es gibt keine Fehler, aber der Prozess wurde beendet. Haben Sie das Problem gelöst? Ich benutze auch Jetson TX1.

@ll884856 Ja, das habe ich tatsächlich. Am Ende habe ich das Basisnetz gegen ein Quetschnetz ausgetauscht und das Netz erneut trainiert. Beachten Sie jedoch, dass die Leistung viel schlechter ist als beim ursprünglichen ResNet-Backbone.
Was Sie auch versuchen könnten, bevor Sie das Basenet wechseln, ist, den FPN auszuschalten, was ebenfalls hilfreich sein könnte. Aber es wird auch die Leistung reduzieren, obwohl ich hoffe, dass die Abnahme nicht so schlimm ist.
Wenn Sie möchten, kann ich Ihnen meine Implementierung und Gewichte des Squeezenets mitteilen. Ich arbeite gerade an meiner Bachelorarbeit zu diesem Thema.

@johannathiemich Danke für deine Antwort! Tatsächlich war ich gerade in diesem Bereich und bin mir über die Architektur von Mask R-CNN nicht ganz klar. Wenn Sie mir Ihre Implementierung und Gewichtung geben können, wird es mir sehr helfen, Mask R-CNN zu verstehen und zu implementieren. Meine E-Mail ist [email protected]
Dankeschön !

Ja, Sie können Mask-RCNN auf der CPU ausführen, nur nicht mit Detectron:

sehen:
https://vimeo.com/277180815

Ich habe ein ähnliches Problem, also wenn mir hier jemand helfen kann, würde ich es wirklich schätzen https://github.com/facebookresearch/detectron2/issues/1539 Ich verstehe wirklich nicht, warum das passiert. Also benötige ich 9,3 GB RAM für die Vorhersage von 25 Bildern in einem Stapel auf der CPU, nachdem ich einen Teil mit torsion.nograd () darin eingefügt habe.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

elfpattern picture elfpattern  ·  3Kommentare

kampelmuehler picture kampelmuehler  ·  4Kommentare

kleingeo picture kleingeo  ·  3Kommentare

coldgemini picture coldgemini  ·  3Kommentare

Adhders picture Adhders  ·  3Kommentare