The Python SDK does as well. These calls are coming from
to_runner_api, is_stateful_dofn, and validate_stateful_dofn which are
invoked once per pipene or bundle. They are, however, surprisingly
expensive. Even memoizing across those three calls should save a
significant amount of time. Udi, did you want to tackle this?

Looking at the profile, Pipeline.to_runner_api() is being called 30
times in this test, and [Applied]PTransform.to_fn_api being called
3111 times, so that in itself might be interesting to investigate.

On Tue, Oct 29, 2019 at 8:26 AM Robert Burke <rob...@frantil.com> wrote:
>
> As does the Go SDK. Invokers are memoized and when possible code is generated 
> to avoid reflection.
>
> On Tue, Oct 29, 2019, 6:46 AM Kenneth Knowles <k...@google.com> wrote:
>>
>> Noting for the benefit of the thread archive in case someone goes digging 
>> and wonders if this affects other SDKs: the Java SDK memoizes DoFnSignatures 
>> and generated DoFnInvoker classes.
>>
>> Kenn
>>
>> On Mon, Oct 28, 2019 at 6:59 PM Udi Meiri <eh...@google.com> wrote:
>>>
>>> Re: #9283 slowing down tests, ideas for slowness:
>>> 1. I added a lot of test cases, some with locally run pipelines.
>>> 2. The PR somehow changed how coders are selected, and now we're using less 
>>> efficient ones.
>>> 3. New dependency funcsigs is slowing things down? (py2 only)
>>>
>>> I ran "pytest -k PipelineAnalyzerTest --profile-svg" on 2.7 and 3.7 and got 
>>> these cool graphs (attached).
>>> 2.7: core:294:get_function_arguments takes 56.66% of CPU time (IIUC), gets 
>>> called ~230k times
>>> 3.7: core:294:get_function_arguments 30.88%, gets called ~200k times
>>>
>>> After memoization of get_function_args_defaults:
>>> 2.7: core:294:get_function_arguments 20.02%
>>> 3.7: core:294:get_function_arguments 8.11%
>>>
>>>
>>> On Mon, Oct 28, 2019 at 5:38 PM Pablo Estrada <pabl...@google.com> wrote:
>>>>
>>>> *not deciles, but 9-percentiles : )
>>>>
>>>> On Mon, Oct 28, 2019 at 5:31 PM Pablo Estrada <pabl...@google.com> wrote:
>>>>>
>>>>> I've ran the tests in Python 2 (without cython), and used a utility to 
>>>>> track runtime for each test method. I found some of the following things:
>>>>> - Total test methods run: 2665
>>>>> - Total test runtime: 990 seconds
>>>>> - Deciles of time spent:
>>>>>   - 1949 tests run in the first 9% of time
>>>>>   - 173 in the 9-18% rang3e
>>>>>   - 130 in the 18-27% range
>>>>>   - 95 in the 27-36% range
>>>>>   - 77
>>>>>   - 66
>>>>>   - 55
>>>>>   - 46
>>>>>   - 37
>>>>>   - 24
>>>>>   - 13 tests run in the last 9% of time. This represents about 1 minute 
>>>>> and a half.
>>>>>
>>>>> We may be able to look at the slowest X tests, and get gradual 
>>>>> improvements from there. Although it seems .. not dramatic ones : )
>>>>>
>>>>> FWIW I uploaded the results here: 
>>>>> https://storage.googleapis.com/apache-beam-website-pull-requests/python-tests/nosetimes.json
>>>>>
>>>>> The slowest 13 tests were:
>>>>>
>>>>> [('apache_beam.runners.interactive.pipeline_analyzer_test.PipelineAnalyzerTest.test_basic',
>>>>>   5.253582000732422),
>>>>>  
>>>>> ('apache_beam.runners.interactive.interactive_runner_test.InteractiveRunnerTest.test_wordcount',
>>>>>   7.907713890075684),
>>>>>  
>>>>> ('apache_beam.io.gcp.bigquery_test.PipelineBasedStreamingInsertTest.test_failure_has_same_insert_ids',
>>>>>   5.237942934036255),
>>>>>  ('apache_beam.transforms.combiners_test.CombineTest.test_global_sample',
>>>>>   5.563946008682251),
>>>>>  
>>>>> ('apache_beam.runners.worker.sideinputs_test.EmulatedCollectionsTest.test_large_iterable_values',
>>>>>   5.680700063705444),
>>>>>  
>>>>> ('apache_beam.io.parquetio_test.TestParquet.test_sink_transform_multiple_row_group',
>>>>>   6.111238956451416),
>>>>>  
>>>>> ('apache_beam.runners.worker.statesampler_test.StateSamplerTest.test_basic_sampler',
>>>>>   6.007534980773926),
>>>>>  
>>>>> ('apache_beam.runners.interactive.interactive_runner_test.InteractiveRunnerTest.test_basic',
>>>>>   13.993916988372803),
>>>>>  
>>>>> ('apache_beam.runners.interactive.pipeline_analyzer_test.PipelineAnalyzerTest.test_read_cache_expansion',
>>>>>   6.3383049964904785),
>>>>>  
>>>>> ('apache_beam.runners.interactive.pipeline_analyzer_test.PipelineAnalyzerTest.test_word_count',
>>>>>   9.157485008239746),
>>>>>  
>>>>> ('apache_beam.runners.portability.portable_runner_test.PortableRunnerTestWithSubprocesses.test_pardo_side_and_main_outputs',
>>>>>   5.191173076629639),
>>>>>  
>>>>> ('apache_beam.io.vcfio_test.VcfSourceTest.test_pipeline_read_file_pattern_large',
>>>>>   6.2221620082855225),
>>>>>  
>>>>> ('apache_beam.io.fileio_test.WriteFilesTest.test_streaming_complex_timing',
>>>>>   7.7187910079956055)]
>>>>>
>>>>> On Mon, Oct 28, 2019 at 3:10 PM Pablo Estrada <pabl...@google.com> wrote:
>>>>>>
>>>>>> I have written https://github.com/apache/beam/pull/9910 to reduce 
>>>>>> FnApiRunnerTest variations.
>>>>>> I'm not in a rush to merge, but rather happy to start a discussion.
>>>>>> I'll also try to figure out if there are other tests slowing down the 
>>>>>> suite significantly.
>>>>>> Best
>>>>>> -P.
>>>>>>
>>>>>> On Fri, Oct 25, 2019 at 7:41 PM Valentyn Tymofieiev 
>>>>>> <valen...@google.com> wrote:
>>>>>>>
>>>>>>> Thanks, Brian.
>>>>>>> +Udi Meiri
>>>>>>> As next step, it would be good to know whether slowdown is caused by 
>>>>>>> tests in this PR, or its effect on other tests, and to confirm that 
>>>>>>> only Python 2 codepaths were affected.
>>>>>>>
>>>>>>> On Fri, Oct 25, 2019 at 6:35 PM Brian Hulette <bhule...@google.com> 
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> I did a bisect based on the runtime of `./gradlew 
>>>>>>>> :sdks:python:test-suites:tox:py2:testPy2Gcp` around the commits 
>>>>>>>> between 9/1 and 9/15 to see if I could find the source of the spike 
>>>>>>>> that happened around 9/6. It looks like it was due to PR#9283 [1]. I 
>>>>>>>> thought maybe this search would reveal some mis-guided configuration 
>>>>>>>> change, but as far as I can tell 9283 just added a well-tested 
>>>>>>>> feature. I don't think there's anything to learn from that... I just 
>>>>>>>> wanted to circle back about it in case others are curious about that 
>>>>>>>> spike.
>>>>>>>>
>>>>>>>> I'm +1 on bumping some FnApiRunner configurations.
>>>>>>>>
>>>>>>>> Brian
>>>>>>>>
>>>>>>>> [1] https://github.com/apache/beam/pull/9283
>>>>>>>>
>>>>>>>> On Fri, Oct 25, 2019 at 4:49 PM Pablo Estrada <pabl...@google.com> 
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> I think it makes sense to remove some of the extra FnApiRunner 
>>>>>>>>> configurations. Perhaps some of the multiworkers and some of the grpc 
>>>>>>>>> versions?
>>>>>>>>> Best
>>>>>>>>> -P.
>>>>>>>>>
>>>>>>>>> On Fri, Oct 25, 2019 at 12:27 PM Robert Bradshaw 
>>>>>>>>> <rober...@google.com> wrote:
>>>>>>>>>>
>>>>>>>>>> It looks like fn_api_runner_test.py is quite expensive, taking 10-15+
>>>>>>>>>> minutes on each version of Python. This test consists of a base class
>>>>>>>>>> that is basically a validates runner suite, and is then run in 
>>>>>>>>>> several
>>>>>>>>>> configurations, many more of which (including some expensive ones)
>>>>>>>>>> have been added lately.
>>>>>>>>>>
>>>>>>>>>> class FnApiRunnerTest(unittest.TestCase):
>>>>>>>>>> class FnApiRunnerTestWithGrpc(FnApiRunnerTest):
>>>>>>>>>> class FnApiRunnerTestWithGrpcMultiThreaded(FnApiRunnerTest):
>>>>>>>>>> class FnApiRunnerTestWithDisabledCaching(FnApiRunnerTest):
>>>>>>>>>> class FnApiRunnerTestWithMultiWorkers(FnApiRunnerTest):
>>>>>>>>>> class FnApiRunnerTestWithGrpcAndMultiWorkers(FnApiRunnerTest):
>>>>>>>>>> class FnApiRunnerTestWithBundleRepeat(FnApiRunnerTest):
>>>>>>>>>> class 
>>>>>>>>>> FnApiRunnerTestWithBundleRepeatAndMultiWorkers(FnApiRunnerTest):
>>>>>>>>>>
>>>>>>>>>> I'm not convinced we need to run all of these permutations, or at
>>>>>>>>>> least not all tests in all permutations.
>>>>>>>>>>
>>>>>>>>>> On Fri, Oct 25, 2019 at 10:57 AM Valentyn Tymofieiev
>>>>>>>>>> <valen...@google.com> wrote:
>>>>>>>>>> >
>>>>>>>>>> > I took another look at this and precommit ITs are already running 
>>>>>>>>>> > in parallel, albeit in the same suite. However it appears Python 
>>>>>>>>>> > precommits became slower, especially Python 2 precommits [35 min 
>>>>>>>>>> > per suite x 3 suites], see [1]. Not sure yet what caused the 
>>>>>>>>>> > increase, but precommits used to be faster. Perhaps we have added 
>>>>>>>>>> > a slow test or a lot of new tests.
>>>>>>>>>> >
>>>>>>>>>> > [1] 
>>>>>>>>>> > https://scans.gradle.com/s/jvcw5fpqfc64k/timeline?task=ancsbov425524
>>>>>>>>>> >
>>>>>>>>>> > On Thu, Oct 24, 2019 at 4:53 PM Ahmet Altay <al...@google.com> 
>>>>>>>>>> > wrote:
>>>>>>>>>> >>
>>>>>>>>>> >> Ack. Separating precommit ITs to a different suite sounds good. 
>>>>>>>>>> >> Anyone is interested in doing that?
>>>>>>>>>> >>
>>>>>>>>>> >> On Thu, Oct 24, 2019 at 2:41 PM Valentyn Tymofieiev 
>>>>>>>>>> >> <valen...@google.com> wrote:
>>>>>>>>>> >>>
>>>>>>>>>> >>> This should not increase the queue time substantially, since 
>>>>>>>>>> >>> precommit ITs are running sequentially with precommit tests, 
>>>>>>>>>> >>> unlike multiple precommit tests which run in parallel to each 
>>>>>>>>>> >>> other.
>>>>>>>>>> >>>
>>>>>>>>>> >>> The precommit ITs we run are batch and streaming wordcount tests 
>>>>>>>>>> >>> on Py2 and one Py3 version, so it's not a lot of tests.
>>>>>>>>>> >>>
>>>>>>>>>> >>> On Thu, Oct 24, 2019 at 1:07 PM Ahmet Altay <al...@google.com> 
>>>>>>>>>> >>> wrote:
>>>>>>>>>> >>>>
>>>>>>>>>> >>>> +1 to separating ITs from precommit. Downside would be, when 
>>>>>>>>>> >>>> Chad tried to do something similar [1] it was noted that the 
>>>>>>>>>> >>>> total time to run all precommit tests would increase and also 
>>>>>>>>>> >>>> potentially increase the queue time.
>>>>>>>>>> >>>>
>>>>>>>>>> >>>> Another alternative, we could run a smaller set of IT tests in 
>>>>>>>>>> >>>> precommits and run the whole suite as part of post commit tests.
>>>>>>>>>> >>>>
>>>>>>>>>> >>>> [1] https://github.com/apache/beam/pull/9642
>>>>>>>>>> >>>>
>>>>>>>>>> >>>> On Thu, Oct 24, 2019 at 12:15 PM Valentyn Tymofieiev 
>>>>>>>>>> >>>> <valen...@google.com> wrote:
>>>>>>>>>> >>>>>
>>>>>>>>>> >>>>> One improvement could be move to Precommit IT tests into a 
>>>>>>>>>> >>>>> separate suite from precommit tests, and run it in parallel.
>>>>>>>>>> >>>>>
>>>>>>>>>> >>>>> On Thu, Oct 24, 2019 at 11:41 AM Brian Hulette 
>>>>>>>>>> >>>>> <bhule...@google.com> wrote:
>>>>>>>>>> >>>>>>
>>>>>>>>>> >>>>>> Python Precommits are taking quite a while now [1]. Just 
>>>>>>>>>> >>>>>> visually it looks like the average length is 1.5h or so, but 
>>>>>>>>>> >>>>>> it spikes up to 2h. I've had several precommit runs get 
>>>>>>>>>> >>>>>> aborted due to the 2 hour limit.
>>>>>>>>>> >>>>>>
>>>>>>>>>> >>>>>> It looks like there was a spike up above 1h back on 9/6 and 
>>>>>>>>>> >>>>>> the duration has been steadily rising since then. Is there 
>>>>>>>>>> >>>>>> anything we can do about this?
>>>>>>>>>> >>>>>>
>>>>>>>>>> >>>>>> Brian
>>>>>>>>>> >>>>>>
>>>>>>>>>> >>>>>> [1] 
>>>>>>>>>> >>>>>> http://104.154.241.245/d/_TNndF2iz/pre-commit-test-latency?orgId=1&from=now-90d&to=now&fullscreen&panelId=4

Reply via email to