Русский
Русский
English
Статистика
Реклама

Блог компании рн-башнипинефть

Нефтянка для инженеров, программистов, математиков и широких масс трудящихся, часть 3

19.06.2020 08:12:45 | Автор: admin
image

Сегодня мы расскажем о том, кто куда мигрирует в нефтяной отрасли, о том, что происходит с месторождением при добыче, и о том, как вода, нефть и газ взаимодействуют. Это третья часть из серии статей для будущих математиков-программистов, которым предстоит решать задачи, связанные с моделированием нефтедобычи и разработкой инженерного ПО в области сопровождения нефтедобычи. В книжках всё расписано гораздо подробнее, зато здесь о нефтянке рассказывают программисты и для программистов.


Первую и вторую части серии можно прочесть здесь:
habr.com/ru/company/bashnipineft/blog/505300
habr.com/ru/company/bashnipineft/blog/506198

Осадконакопление, образование нефти, миграция

Теорий образования нефти есть несколько, я буду говорить только о той, согласно которой нефть образовалась из остатков живых существ зоопланктона и водорослей. Когда-то давным-давно, in a galaxy far far away, этот самый зоопланктон и водоросли размножался так бурно, а условия по наличию (точнее, отсутствию) кислорода и нужной температуры были такие, что он не успевал разложиться и падал на дно моря, будучи в дальнейшем засыпаем всякой осадочной породой (песочком и глиной). Сейчас даже деревья отказываются превращаться в каменный уголь, а просто, заразы, в присутствии кислорода гниют, а тогда они аналогично планктону подвергались захоронению и с течением времени погружались на всё большую и большую глубину, уплотнялись и обезвоживались. Это не означает, кстати, что вода куда-то пропадала вода всегда была и оставалась вокруг, пропитывая породу. Вода уходила из самих остатков клеток и органических соединений.

image

По мере того, как захороненное неразложившееся органическое вещество погружалось всё глубже, температура и давление росли, и наконец, попали в такое окно параметров (выше температура и давление недостаточно большие, глубже температура и давление слишком большие), где органическое вещество стало преобразовываться в углеводороды, составляющие нефть и газ такую породу называют нефтематеринской, потому что именно она рождала (и рождает до сих пор, только ооочень медленно!) нефть. Получившиеся углеводороды легче воды, поэтому они мигрируют вверх, в сторону поверхности, просачиваясь через проницаемые породы и застревая на непроницаемых.

На пути к поверхности нефть встречает много разных слоёв, и они к этому времени совсем не обязательно будут горизонтальными. Река подточила глиняный утёс, он упал в воду и его смыло, вынесло в море, и там вся эта глина упала на дно в виде протяжённого, более или менее горизонтального пятна. Процессы движения литосферы, процессы горообразования вспучили земную твердь, и вот уже когда-то горизонтальный пласт низкопроницаемой глины выпятило в виде арки ловушка для нефти готова. Где-то нефть с газом попадёт в такие ловушки и застрянет на определённой глубине, а где-то просочится практически на поверхность. В последнем случае газ и лёгкие углеводороды, конечно, большей частью опередят всех остальных, достигнут поверхности и улетучатся, и останутся битуминозные пески Альберты и бассейна реки Ориноко, но в качестве противоположных примеров предлагаю вспомнить бакинские колодцы и озера с нефтью в 19 веке, а также горящие уже тысячи лет огни Химеры выходы метана на поверхность в районе турецкой горы Олимпос.

image

Нам важнее всего то, что традиционные месторождения, в которых можно встретить подвижную нефть, чаще всего образуются под куполами из непроницаемой породы или подобными же образовавшимися в результате разломов ловушками, под которыми скопилась в процессе своей миграции наверх нефть. Если откуда-то туда смогла прийти нефть, то гораздо раньше там захватила своё место вода. Когда нефть вытесняет из породы воду, часть воды всё равно в породе остаётся в виде прилипшей к гидрофильной породе плёнки или заполняющей очень мелкие поры и держащейся там очень сильными капиллярными силами, поэтому нефть всегда в месторождении соседствует с водой, пусть даже такой связанной и отказывающейся двигаться (если бы такая вода могла двигаться, нефть бы её выдвинула из породы при своей миграции). Если нефть мигрировала вместе с газом, то они могли вместе попасть в ловушку, тогда у такого месторождения возможно будет газовая шапка насыщенная газом область проницаемой породы над насыщенной нефтью областью. И наконец, под самой нефтью может остаться область проницаемой породы, насыщенная водой, тогда говорят о месторождении с подстилающей водой. А может и не остаться.

image

Динамика свойств и технологических показателей в процессе работы скважины

С тех пор, как месторождение нефти образовалось, прошло очень много времени, процессы миграции завершились, все переходные процессы устаканились, всё смешиваемое перемешалось, всё несмешиваемое снова разделилось, система пришла в равновесие, остались активными только очень медленные процессы, которые короткоживущие белковые существа могут не учитывать. А потом вдруг раз! эти самые белковые существа изобрели паровую машину, электричество и принялись бурить скважины и добывать нефть.

Какое было начальное пластовое давление? Если забыть про все эти ловушки для нефти и вообразить, будто вся земля представляет собой проницаемый песчаник, насыщенный водой, то давление жидкости на любой глубине будет определяться только плотностью этой воды и глубиной: это известная со школы формула ро-жэ-аш. Делайте как мы, забудьте начальную школу с её задачками на перевод из дециакров в кубофуты и считайте всё только в единицах СИ, и будет вам счастье. Получаем примерно 1000*10*2000 Паскалей или примерно 200 атмосфер.

image

Если пластовое давление в месторождении примерно равно давлению столба жидкости на той же глубине, говорят о нормальном пластовом давлении; если сильно больше или сильно меньше, то говорят об аномально высоком или низком пластовом давлении. Нефтяники, конечно, любят высокое, но не аномально высокое. Если пробурить скважину до месторождения и заполнить её водой, то в случае нормального пластового давления уровень воды в скважине не будет меняться. В случае пониженного пластового давления, уровень воды в скважине начнёт падать и упадёт до высоты, соответствующей текущему пластовому давлению удобный способ для оценки пластового давления, кстати, понадобятся только два хронометра.

В случае повышенного пластового давления воду из скважины будет выталкивать со всё повышающейся скоростью, и наконец из скважины забьёт фонтан нефти! Теперь представим, что у месторождения нормальное начальное пластовое давление, не повышенное, но скважина заполнена не водой, а нефтью. У нефти плотность меньше, чем у воды, поэтому ро-жэ-аш у такого столба нефти будет меньше, чем пластовое давление, и нефть из скважины будет выталкивать! Чтобы остановить такую скважину, нужно её заглушить, заменить нефть в стволе скважины на воду, а при аномально высоком пластовом давлении ещё и с растворенными солями, чтобы плотность была побольше и ро-жэ-аш как раз равнялось пластовому давлению (и чуть-чуть его превышало). Сами понимаете, при аномально высоком пластовом давлении ещё и при бурении будут проблемы нужно пробурить скважину, создав открытую связь месторождения под давлением с поверхностью, но при этом не допустив выбросов из-за повышенного давления.

image

Что происходит с физико-химическими свойствами месторождения при добыче? В первом приближении можно считать, что пористость, проницаемость и сжимаемость не меняются, потому что порода остаётся на месте, а вот все насыщающие её флюиды начинают мигрировать, поэтому меняются давление и насыщение. Пусть скважина была заполнена нефтью и при этом находилась в равновесии с пластовым давлением. Насос начинает добывать нефть из скважины, динамический уровень нефти в скважине начинает падать, забойное давление (давление столба жидкости по ро-жэ-аш на забой, то есть нижнюю часть скважины) тоже падает. Насос может быть настроен так, чтобы работать с заданным постоянным расходом, или (если в нём есть свой манометр) поддерживать заданное постоянное забойное давление. Перепад давления (называемый депрессией) между забойным (в стволе скважины) и пластовым (в прилегающей к скважине призабойной части месторождения) давлением вызывает приток нефти к скважине. Но и одновременно при этом понижает пластовое давление в призабойной зоне месторождения! Если проницаемость достаточная, то волна падения давления распространяется дальше, вызывая приток нефти из всё более дальних частей месторождения. Теоретически, при большой проницаемости можно всю нефть месторождения выкачать одной скважиной, просто это займёт очень много времени.

image

В реальности, через некоторое время для поддержания пластового давления начнут работу нагнетательные скважины, которые наоборот, закачивают в ствол скважины воду, создавая повышенное забойное давление. Обратный перепад давления (репрессия) между стволом скважины и призабойной зоной приводит к тому, что из скважины в месторождение начинает распространяться закачиваемая вода вместе с волной повышенного давления. Это с одной стороны не даёт пластовому давлению падать, а с другой стороны как бы поршнем вытесняет нефть от нагнетательных скважин в сторону добывающих. Хотя если вместо поршневого вытеснения закачиваемая вода пробьёт себе прямые каналы от нагнетательных скважин к добывающим, на оставшейся в этой части месторождения нефти можно ставить крест.

Итак, после начала добычи и закачки на месторождении начинается невиданная за тысячи лет движуха перераспределяется пластовое давление, вызывая фильтрацию (напоминаю, слово фильтрация можно смело заменять на перетоки) содержимого от мест с большим давлением к местам с меньшим, меняя, таким образом, во всех точках нефтенасыщенность, водонасыщенность и газонасыщенность. Если вдруг добычу остановить, то через некоторое время пластовое давление выровняется, на месторождении останется только одна сила тяжести и снова начнутся те же медленные процессы восстановления равновесия: более тяжёлая вода вниз, более лёгкий газ вверх, нефть между ними. Коктейль снова расслаивается.

Физико-химические свойства нефти, воды и газа

Физико-химические свойства флюидов, то есть всего того, что в месторождении может течь и фильтроваться сквозь породу, сильно влияют на то, как эта фильтрация происходит. Мы уже видели, что скорость фильтрации прямо пропорциональна проницаемости породы и обратно пропорциональна вязкости. В условиях, когда в какой-то точке месторождения есть и вода, и газ, и нефть, они фильтруются все одновременно в соответствии с общей абсолютной проницаемостью и собственной вязкостью.

Но оказывается, когда они все находятся в одном месте, в одних и тех же порах, они друг другу начинают мешать, и скорость фильтрации их всех зависит не только от абсолютной проницаемости породы и собственной вязкости, но и от количества остальных флюидов в наличии. Так, например, опыты показывают, что когда в одних и тех же порах находятся нефть и вода, скорость фильтрации нефти при соотношении 10:1 может оказаться во много раз больше, чем скорость фильтрации нефти при соотношении 1:10.

image

Я понимаю, формулы страшные, но всё-таки, давайте я их объясню на пальцах. Вот раньше мы думали, что всё течёт пропорционально проницаемости и перепаду давления и обратно пропорционально вязкости. Оказывается, когда есть и вода, и нефть, то надо считать отдельно скорость воды и скорость нефти, каждый со своей вязкостью. При этом проницаемость в формуле, что для нефти, что для воды, состоит из какой-то общей неизменной проницаемости, определяемой породой, и дополнительного множителя, который у воды и нефти свой, и этот множитель зависит от количества воды.

Другими словами, когда воды мало, она почти не мешает нефти фильтроваться, а вот когда воды уже много, оставшаяся нефть практически перестаёт фильтроваться. Выглядит это так, будто на коэффициент проницаемости породы накладывается дополнительный множитель, называемый коэффициентом относительной фазовой проницаемости, который для каждого флюида (воды, нефти, газа) свой и ещё, более того, зависит от насыщения (доли воды, нефти и газа).

image

В итоге, есть абсолютная проницаемость породы, которая зависит только от породы, и есть относительная проницаемость для воды, нефти, газа, которая зависит и от их пропорции, и это всё отображается на графиках, подобных тому, что я привёл выше. Как такую картинку читать? Водонасыщенности меньше 20% на этом гипотетическом месторождении нет, то есть воды всегда как минимум 20%. При таком содержании воды её относительная фазовая проницаемость равна нулю, то есть вода есть, её 20%, но она не течёт никуда, течёт только нефть. С другой стороны, когда воды становится 75% (а нефти остаётся, соответственно, только 25%), относительная фазовая проницаемость нефти падает до нуля, и значит уже нефть никуда больше не течёт, и эти оставшиеся 25% из пор никак не выковырять.

Плотность нефти, воды и газа влияет на их начальное распределение в месторождении. В полном соответствии с законом Архимеда, менее плотные газ и нефть располагаются в верхней части месторождения, а более плотная вода в нижней. В процессе разработки месторождения все эти эффекты, разумеется, продолжают действовать, хотя и могут не успевать за происходящими событиями. Одно дело пузырику газа всплыть со дна стакана на поверхность, а совсем другое просочиться с нижнего пласта до верхнего через мелкие поры породы, где вода и нефть, удерживаемые капиллярными силами, не горят желанием пропускать какие-то пузыри.

Ещё одна особенность нефти заключается в её способности растворять углеводородный газ (чаще всего метан). В одном кубометре нефти могут быть растворены десятки и сотни кубометров газа, в зависимости от давления. Отношение объёма газа, выделившегося из нефти при добыче её на белый свет и в нормальные условия, к объёму той нефти, из которой он выделился, называется газосодержанием. Если вы добываете нефть с газосодержанием, равным 100, то при добыче 1 кубометра нефти вы получите попутно ещё и 100 кубометров газа, которые в ней были растворены и которые из неё при добыче выделятся.

image

Обратите внимание и никогда не путайте: газосодержание это объём газа, растворенного в единице объёма нефти, а газонасыщенность это доля объёма пор породы, занимаемая свободным газом. Ещё есть один показатель: растворимость газа это объём газа, который потенциально может раствориться в единице объёма этой нефти при заданном давлении.
Растворимость сколько газа может раствориться в нефти при заданном давлении, а газосодержание сколько газа на самом деле растворено. Понятно, что второе никогда не может превысить первое. Если вы в одну бочку поместите нефть без растворённого газа, то газосодержание у этой нефти будет равно нулю. Если вы затем начнёте в эту бочку нагнетать газ под давлением в 200 атмосфер, то газ начнёт в нефти растворяться без остатка, и газосодержание нефти станет расти. Как только газосодержание нефти достигнет растворимости газа при заданном давлении, процесс растворения прекратится, и оставшийся газ начнёт скапливаться в верхней части бочки.

Нефть, в которой при текущем давлении растворено максимальное возможное количество газа, называется насыщенной нефтью, а давление такое называется давлением насыщения. Давление насыщения для заданной нефти это такое давление, при снижении ниже которого из нефти начинает выделяться растворённый в ней газ. Если предположить, что газа больше нет, и начать повышать давление, то с нефтью ничего не будет происходить (хотя она и перестанет быть насыщенной). Если начать, наоборот, понижать давление, то как только давление станет ниже давления насыщения, из нефти начнёт выделяться растворённый в ней газ, и газосодержание начнёт падать (а газонасыщенность породы, в которой всё это происходит, начнёт расти).

image

В случае месторождения всё происходит похожим образом, но в разных направлениях в зависимости от того, что было в начале и что происходит. Если у месторождения была газовая шапка при давлении в 200 атмосфер, это значит, что нефть уже приняла весь газ, который могла растворить, и находится в насыщенном состоянии. Если начать закачивать в месторождение воду и повышать пластовое давление, то растворимость газа (способность нефти вмещать газ) начинает расти, и газ тут же пользуется этой возможностью и в нефти начинает растворяться (правда, происходит это не быстро). Так что повышая давление можно теоретически добиться, чтобы вся газовая шапка на месторождении растворилась в нефти. Допустим, что это произойдёт при 250 атмосферах, а мы продолжаем нагнетать, что будет происходить, когда пластовое давление вырастет, скажем, до 300 атмосфера? Да ничего, газа как не было, так и не будет. Но нефть как бы запомнила, при каком давлении в ней растворился последний кубометр газа, это давление и называется давлением насыщения.
Если затем начать добывать нефть и снижать давление с 300 до 290, 280, 270 атмосфер, то ничего происходить не будет, но как только давление упадёт до давления насыщения 250 атмосфер, газ начнёт снова выделяться, причём не в шапку, а по всему объёму, и быстро.
Если у месторождения с пластовым давлением в 200 атмосфер с самого начала не было газовой шапки, означает ли это, что в этой нефти нет растворённого газа? Нет, не означает растворённый газ всегда в нефти есть, просто из-за условий её образования. Для такой нефти важно знать, какое у неё газосодержание и давление насыщения, потому что если вдруг в процессе разработки пластовое давление упадёт ниже давления насыщения, то по всему объёму месторождения из нефти начнёт выделяться газ, и этот газ будет очень сильно мешать нормальной фильтрации нефти к скважинам.

image

Кому трудно понять суть всех этих происходящих процессов с растворением, растворимостью и давлением насыщения, я предлагаю представить себе только что купленную бутылку с газированной водой. В ней, очевидно, под давлением находится вода с растворённым в ней углекислым газом и небольшое количество углекислого газа под крышкой, при этом они находятся в равновесии: газ больше не растворяется, но и не выделяется из воды. Вы вряд ли можете провести этот эксперимент в реальности, поэтому придётся провести его мысленно: если бутылку сжать, повысив в ней давление, то можно добиться того, что весь газ из-под крышки растворится, и в бутылке будет только вода. А вот обратный эксперимент провести легко: если чуть-чуть отвернуть крышку, стравить часть газа и крышку обратно закрутить, то давление под крышкой и в воде уменьшится. А раз до этого вода и газ находились в равновесии, то теперь мы опустили давление ниже давления насыщения, и газ из воды начнёт выделяться, причём по всему объёму сразу, пока не установится новое равновесие.

Кроме этого, важно знать, что при растворении в нефти газа, объём этой самой нефти увеличивается. И наоборот, при добыче 1 кубометра нефти из пласта, когда мы её поднимем на поверхность и из неё выделится растворённый газ, её объем уменьшится в соответствии с так называемым объёмным коэффициентом. Когда нефть поднимают на поверхность, происходит сразу несколько явлений, в разном направлении влияющих на её объём: падает давление (нефть увеличивает объём в соответствии со своим коэффициентом сжимаемости), падает температура (нефть уменьшает объём в соответствии со своим коэффициентом температурного расширения), улетучивается растворённый газ (объём и масса нефти уменьшаются). Всё это вместе объединяют в единый объёмный коэффициент. Если он равен, например, 1.2, то чтобы получить 1 кубометр на поверхности, нужно забрать 1.2 кубометра из пласта.

И вязкость, и объёмный коэффициент, конечно, зависят от давления и газосодержания: чем больше газосодержание (при одном и том же давлении), тем больше объёмный коэффициент и тем меньше вязкость. Чем больше давление (при одном и том же газосодержании), тем больше вязкость и меньше объёмный коэффициент.

В следующей части мы коснемся вопросов математического моделирования процессов, происходящих при разработке нефтяных и газовых месторождений и наконец-то доберёмся до данных, алгоритмов и программного обеспечения.

Продолжение следует
Подробнее..

Нефтянка для инженеров, программистов, математиков и широких масс трудящихся, часть 4

02.07.2020 08:05:44 | Автор: admin
image

Это четвертая часть из серии статей для будущих математиков-программистов, которым предстоит решать задачи, связанные с моделированием нефтедобычи и разработкой инженерного ПО в области сопровождения нефтедобычи.

Сегодня мы расскажем о том, зачем нужны модели месторождений, и как их строить. Модель это тот самый план действий, который обязательно должен быть и предполагаемый результат этих действий.


Моделирование, прогноз, неопределённость


Все перечисленные в предыдущих статьях (раз, два, три) физические эффекты важно понимать не просто для того, чтобы знать, как устроен мир. Скорее всего их придётся учитывать при построении модели, которая умеет правильно предсказывать будущее. Зачем нам уметь предсказывать будущее в нефтедобыче, если цену нефти и коронавирус всё равно не предсказать? Да затем же, зачем и везде: чтобы принимать правильные решения.

image

В случае с месторождением мы не можем непосредственно наблюдать, что происходит под землёй между скважинами. Почти всё, что нам доступно, привязано к скважинам, то есть к редким точкам на необъятных просторах болот (все что мы можем измерить заключено примерно в 0.5% породы, о свойствах остальных 99.5% мы можем только догадываться). Это проведённые измерения на скважинах тогда, когда скважина строилась. Это показания приборов, которые на скважинах установлены (давление на забое, доля нефти воды и газа в получаемой продукции). И это измеряемые и задаваемые параметры работы скважин когда включать, когда выключать, с какой скоростью качать.

Правильная модель это такая модель, которая правильно предсказывает будущее. Но так как будущее ещё не наступило, а понять, хороша ли модель, хочется уже сейчас, то поступают так: вкладывают в модель всю имеющуюся фактическую информацию о месторождении, в соответствии с предположениями добавляют свои догадки о неизвестной информации (крылатая фраза два геолога три мнения как раз об этих догадках) и выполняют симуляцию происходивших под землей процессов фильтрации, перераспределения давления и так далее. Модель выдаёт, какие должны были наблюдаться показатели работы скважин, и они сравниваются с реально наблюдавшимися показателями. Другими словами, мы пытаемся построить такую модель, которая воспроизводит историю.
Вообще-то, можно схитрить и просто потребовать от модели, чтобы она выдавала такие данные, какие надо. Но, во-первых, так делать нельзя, а во-вторых, всё равно заметят (эксперты в тех самых гос.органах, куда модель нужно сдавать).

image

Если модель не может воспроизвести историю, необходимо менять её входные данные, но какие? Фактические данные менять нельзя: это результат наблюдения и измерения реальности данные с приборов. Приборы, конечно, имеют свою погрешность, да и используются приборы людьми, которые тоже могут и накосячить, и приврать, но неопределённость фактических данных в модели, как правило, мала. Менять можно и нужно то, что имеет наибольшую неопределённость: наши предположения о том, что происходит между скважинами. В этом смысле построение модели это попытка уменьшить неопределённость в наших знаниях о реальности (в математике этот процесс известен как решение обратной задачи, и обратных задач в нашей области как велосипедов в Пекине!).

Если модель достаточно корректно воспроизводит историю, у нас есть надежда, что наши знания о реальности, вложенные в модель, не сильно от этой самой реальности отличаются. Тогда и только тогда мы можем такую модель запустить на прогноз, в будущее, и такому прогнозу у нас будет больше оснований верить.

Что если удалось сделать не одну, а несколько разных моделей, которые все достаточно хорошо воспроизводят историю, но при этом дают разный прогноз? Нам ничего не остаётся, как жить с этой неопределённостью, принимать решения, имея её в виду. Более того, имея несколько моделей, дающих спектр возможных прогнозов, мы можем попытаться количественно оценить риски принятия того или иного решения, тогда как имея одну модель, мы будем пребывать в неоправданной уверенности в том, что всё будет так, как модель предсказывает.

Модели в жизни месторождения


Для того, чтобы принимать решения в процессе разработки месторождения, нужна целостная модель всего месторождения. Более того, сейчас без такой модели разрабатывать месторождение вообще нельзя: такую модель требуют государственные органы РФ.

image

Всё начинается с сейсмической модели, которая создаётся по результатам сейсморазведки. Такая модель позволяет увидеть под землей трехмерные поверхности специфические слои, от которых хорошо отражаются сейсмические волны. Она не даёт почти никакой информации о нужных нам свойствах (пористости, проницаемости, насыщении, и т. д.), но зато показывает, как изгибаются в пространстве некоторые слои. Если вы сделали многослойный бутерброд, а потом как-то его изогнули (ну или кто-то на него сел), то у вас есть все основания считать, что все слои изогнулись примерно одинаково. Поэтому мы можем понять, как изогнулся слоёный пирог из различных нападавших на дно океана осадков, даже если на сейсмической модели увидим только один из слоёв, по счастливой случайности хорошо отражающий сейсмические волны. На этом месте дата-сайнс инженеры оживились, потому что автоматическое выделение таких отражающих горизонтов в кубе, чем и занимались участники одного из наших хакатонов, классическая задача распознавания образов.

image

Затем начинается разведочное бурение, и по мере бурения скважин в них спускают на кабеле приборы, измеряющие всякие разные показатели вдоль ствола скважины, то есть проводят ГИС (геофизические исследования скважин). Результат такого исследования каротаж ГИС, то есть кривая определённой физической величины, измеренная с определённым шагом вдоль всего ствола скважины. Разные приборы измеряют разные величины, а обученные инженеры затем проводят интерпретацию этих кривых, получая значимую информацию. Один прибор измеряет естественную гамма-радиоактивность породы. Глины фонят сильнее, песчаник фонит слабее это знает любой инженер-интерпретатор и выделяет на каротажной кривой: тут глины, тут слой песчаника, тут что-то среднее. Другой прибор измеряет естественный электрический потенциал между соседними точками, возникающий при проникновении в породу бурового раствора. Высокий потенциал показывает наличие фильтрационной связи между точками пласта, знает инженер и подтверждает наличие проницаемой породы. Третий прибор измеряет сопротивление насыщающего породу флюида: солёная вода ток пропускает, нефть ток не пропускает и позволяет отделить нефтенасыщенные породы от водонасыщенных и так далее.
На этом месте дата-сайнс инженеры снова оживились, потому что входные данные у этой задачи это простые численные кривые, а заменить инженера-интерпретатора какой-нибудь ML-моделью, умеющей вместо инженера по форме кривой сделать вывод о свойствах породы это значит решить классическую задачу классификации. Это только потом у дата-сайнс инженеров начинает дергаться глаз, когда выясняется, что часть этих накопленных кривых со старых скважин есть только в виде длинных бумажных портянок.

image

Кроме этого, при бурении из скважины достают керн образцы более или менее целой (если повезло) и неразрушенной при бурении породы. Эти образцы отправляют в лабораторию, где определят их пористость, проницаемость, насыщение и всякие разные механические свойства. Если известно (а при правильном проведении это должно быть известно), с какой глубины был поднят конкретный образец керна, то когда придут данные из лаборатории, можно будет сопоставить, какие значения на этой глубине показывали все геофизические приборы, и какие значения пористости, проницаемости и насыщенности имела порода на этой глубине по данным лабораторных исследований керна. Таким образом можно пристрелять показания геофизических приборов и затем только по их данным, не имея керна, делать вывод о таких нужных нам для построения модели свойствах породы. Весь дьявол в деталях: приборы замеряют не совсем то, что определяют в лаборатории, но это уже совсем другая история.

Таким образом, пробурив несколько скважин и проведя исследования, мы можем достаточно уверенно утверждать, какая порода и с какими свойствами находится там, где эти скважины были пробурены. Проблема в том, что мы не знаем, что происходит между скважинами. И вот тут нам на помощь приходит сейсмическая модель.

image

На скважинах мы точно знаем, какие свойства имеет порода на какой глубине, но не знаем, как слои породы, наблюдаемые на скважинах, распространяются и изгибаются между ними. Сейсмическая модель не позволяет точно определить, какой слой на какой глубине расположен, но зато уверенно показывает характер распространения и изгиба всех сразу слоёв, характер напластования. Тогда инженеры отмечают на скважинах определённые характерные точки, ставя на определённой глубине маркеры: на этой скважине на этой глубине кровля пласта, на этой глубине подошва. А поверхность кровли и подошвы между скважинами, грубо говоря, рисуют параллельно той поверхности, которую видят в сейсмической модели. В итоге получается набор трёхмерных поверхностей, которые охватывают в пространстве интересующие нас, а нас интересуют, конечно же, пласты, содержащие нефть. То, что получилось, называется структурной моделью, потому что она описывает структуру пласта, но не его внутреннее содержание. О пористости и проницаемости, насыщении и давлении внутри пласта структурная модель не говорит ничего.

image

Затем наступает этап дискретизации, при котором область пространства, занимаемая месторождением, разбивается на такой изогнутый в соответствии с залеганием слоёв (характер которого виден ещё на сейсмической модели!) параллелепипед из ячеек. Каждая ячейка этого изогнутого параллелепипеда однозначно определяется тремя номерами, I, J и K. Все слои этого изогнутого параллелепипеда лежат согласно распространению слоёв, а количество слоёв по K и количество ячеек по I и J определяется детальностью, которую мы можем себе позволить.
Насколько детальная информация о породе у нас есть вдоль ствола скважины, то есть по вертикали? Настолько детальная, насколько часто делал замеры своей величины геофизический прибор при движении по стволу скважины, то есть, как правило, каждые 20-40 см, поэтому каждый слой может быть и 40 см, и 1 м.

Насколько детальная у нас есть информация по латерали, то есть в сторону от скважины? Ни насколько: в сторону от скважины у нас информации нет, поэтому смысла разбивать на очень маленькие ячейки по I и J, как правило, нет, и чаще всего они бывают по 50 или 100 м по обеим координатам. Выбор размера этих ячеек является одной из важных инженерных задач.

image

После того, как вся область пространства разбита на ячейки, делается ожидаемое упрощение: в пределах каждой ячейки значение любого из параметров (пористость, проницаемость, давление, насыщенность и т. д.) считается постоянным. Конечно в реальности это не так, но раз мы знаем, что напластование осадков на дно моря шло слоями, то свойства породы будут гораздо сильнее меняться по вертикали, чем по горизонтали.

image

Итак, у нас есть сетка ячеек, в каждой ячейке своё (неизвестное нам) значение каждого из важных параметров, описывающих как породу, так и её насыщение. Пока эта сетка пустая, но через некоторые ячейки проходят скважины, в которых мы прошли прибором и получили значения кривых геофизических параметров. Инженеры-интерпретаторы с помощью лабораторных исследований керна, корреляций, опыта и такой-то матери, значения кривых геофизических параметров переводят в значения нужных нам характеристик породы и насыщающего флюида, и переносят эти значения со скважины на ячейки сетки, через которые эта скважина проходит. Получается сетка, у которой в некоторых местах в ячейках есть значения, а в большинстве ячеек значений всё ещё нет. Значения во всех остальных ячейках придётся воображать с помощью интерполяции и экстраполяции. Опыт геолога, его знания о том, как свойства породы распространяются обычно, позволяют выбрать правильные алгоритмы интерполяции и правильно заполнить их параметры. Но в любом случае приходится помнить, что всё это догадки о неизвестности, которая лежит между скважинами, и не зря говорят, ещё раз эту прописную истину напомню, что у двух геологов по поводу одной и той же залежи будет три разных мнения.

Результатом этой работы будет геологическая модель трёхмерный изогнутый параллелепипед, разбитый на ячейки, описывающий структуру месторождения и несколько трёхмерных массивов свойств в этих ячейках: чаще всего это массивы пористости, проницаемости, насыщения и признака песчаник-глина.

image

Затем за работу берутся специалисты-гидродинамики. Они могут укрупнить геологическую модель, объединив несколько слоёв по вертикали и пересчитав свойства породы (это называется апскейлинг, и представляет собой отдельную непростую задачу). Потом они добавляют остальные нужные свойства для того, чтобы гидродинамический симулятор мог моделировать, что куда будет перетекать: кроме пористости, проницаемости, нефте-, водо-, газонасыщенности, это будут давление, газосодержание и так далее. Они добавят в модель скважины и внесут по ним информацию о том, когда и в каком режиме они работали. Вы ещё не забыли, что мы пытаемся воспроизвести историю, чтобы иметь надежду на корректный прогноз? Гидродинамики возьмут отчёты из лаборатории и добавят в модель физико-химические свойства нефти, воды, газа и породы, всяческие зависимости их (чаще всего от давления) и всё, что получилось, а это будет гидродинамическая модель, отправят в гидродинамический симулятор. Тот честно рассчитает, из какой ячейки в какую всё будет в какой момент времени перетекать, выдаст графики технологических показателей на каждой скважине и скрупулёзно сравнит их с реальными историческими данными. Гидродинамик вздохнёт, глядя на их расхождение, и пойдёт изменять всё неопределённые параметры, которые он пытается угадать так, чтобы при следующем запуске симулятора получить что-то близкое к реально наблюдавшимся данным. А может при следующем запуске. А может при следующем и так далее.

image

Инженер, готовящий модель поверхностного обустройства, возьмёт те дебиты, которые месторождение по результатам моделирования будет выдавать, и поместит их уже в свою модель, которая рассчитает, в каком трубопроводе будет какое давление и сможет ли имеющаяся система трубопроводов переварить добычу месторождения: очистить добытую нефть, подготовить нужный объём закачиваемой воды и так далее.

И наконец, на самом верхнем уровне, на уровне экономической модели, экономист рассчитает поток расходов на строительство и обслуживание скважин, электроэнергию на работу насосов и трубопроводов и поток дохода от сдачи добытой нефти в систему трубопроводов, умножит на нужную степень коэффициента дисконтирования и получит суммарный NPV от готового проекта разработки месторождения.

Подготовка всех этих моделей, разумеется, требует активного использования баз данных для хранения информации, специализированного инженерного программного обеспечения, реализующего обработку всей входной информации и собственно моделирования, то есть предсказания будущего по прошлому.

Для построения каждой из перечисленных выше моделей используется свой отдельный программный продукт, чаще всего буржуйский, часто практически безальтернативный и поэтому очень дорогой. Такие продукты развиваются десятилетиями, и повторить их путь силами небольшого института дело бессмысленное. Но ведь и динозавров съели не другие динозавры, а маленькие, голодные, целеустремлённые хорьки. Важно то, что, как в случае экселя для ежедневной работы нужны только 10% функциональности, и наши дубли, как у Стругацких, будут только и умеющие, что но зато уж умеющие это делать хорошо как раз эти 10%. В общем, мы полны надежд, для которых определённые основания уже есть.

В этой статье описан только один, столбовой путь жизненного цикла модели всего месторождения, и уже тут есть, где разгуляться разработчикам ПО, а с текущими моделями ценообразования у конкурентов работы хватит надолго. В следующей статье будет spin-off Изгой-один про некоторые частные задачи инженерного моделирования: моделирование гидроразрыва пласта и гибкие насосно-компрессорные трубы.

Продолжение следует
Подробнее..

Как создать голосового помощника на основе технологий с открытым кодом, не передав вовне ни байта секретной информации

14.07.2020 08:12:23 | Автор: admin
image

Зачем нефтяникам NLP? Как заставить компьютер понимать профессиональный жаргон? Можно ли объяснить машине, что такое нагнеталка, приемистость, затрубное? Как связаны вновь принятые на работу сотрудники и голосовой ассистент? На эти вопросы мы постараемся ответить в статье о внедрении в ПО для сопровождения нефтедобычи цифрового ассистента, облегчающего рутинную работу геолога-разработчика.

Мы в институте разрабатываем своё ПО (https://rn.digital/) для нефтяной отрасли, а чтобы его пользователи полюбили, нужно не только полезные функции в нём реализовывать, но и всё время думать об удобстве интерфейса. Одним из трендов UI/UX на сегодняшний день является переход к голосовым интерфейсам. Ведь как ни крути, наиболее естественной и удобной формой взаимодействия для человека является речь. Так было принято решение о разработке и внедрении голосового помощника в наши программные продукты.

Помимо улучшения UI/UX составляющей, внедрение ассистента также позволяет снизить порог вхождения в работу с ПО для новых сотрудников. Функционал у наших программ обширный, и, чтобы со всем разобраться, может уйти не один день. Возможность попросить ассистента выполнить нужную команду позволит сократить время на решение поставленной задачи, а также уменьшить стресс от новой работы.

Поскольку корпоративная служба безопасности очень чувствительно относится к передаче данных во внешние сервисы, мы задумались о разработке ассистента на основе решений с открытым исходным кодом, позволяющих обрабатывать информацию локально.

Структурно наш помощник состоит из следующих модулей:
Распознавание речи (Automatic Speech Recognition, ASR)
Выделение смысловых объектов (Natural Language Understanding, NLU)
Исполнение команд
Синтез речи (Text-to-Speech, TTS)

image
Принцип работы ассистента: от слов (пользователя) к действиям (в ПО)!

Выход каждого модуля служит входной точкой для следующего компонента системы. Так, речь пользователя преобразуется в текст и отправляется на обработку алгоритмам машинного обучения для определения намерения пользователя. В зависимости от этого намерения активируется нужный класс в модуле исполнения команд, который выполняет требование пользователя. По завершении операции модуль исполнения команд передает информацию о статусе выполнения команды модулю синтеза речи, который, в свою очередь, оповещает пользователя.

Каждый модуль помощника представляет собой микросервис. Так, при желании пользователь может обойтись и вовсе без речевых технологий и обратиться напрямую к мозгу ассистента к модулю выделения смысловых объектов через форму чат-бота.

Распознавание речи

Первый этап распознавания речи обработка речевого сигнала и извлечение признаков. Самым простым представлением звукового сигнала может служить осциллограмма. Она отражает количество энергии в каждый момент времени. Однако для определения произносимого звука этой информации недостаточно. Нам важно знать, какое количество энергии содержится в различных частотных диапазонах. Для этого с помощью преобразования Фурье производится переход от осциллограммы к спектру.

image
Это осциллограмма.

image
А это спектр для каждого момента времени.

Здесь нужно уточнить, что речь образуется при прохождении вибрирующего воздушного потока через гортань (источник) и голосовой тракт (фильтр). Для классификации фонем нам важна лишь информация о конфигурации фильтра, то есть о положении губ и языка. Выделить такую информацию позволяет переход от спектра к кепстру (cepstrum анаграмма слова spectrum), выполняемый с помощью обратного преобразования Фурье от логарифма спектра. По оси x вновь откладывается не частота, а время. Для проведения различия между временными областями кепстра и исходного звукового сигнала используют термин сачтота (Оппенгейм, Шафер. Цифровая обработка сигналов, 2018).

image
Кепстр, или просто спектр логарифма спектра. Да-да, сачтота это термин, а не опечатка

Информация о положении голосового тракта находится в 12 первых коэффициентах кепстра. Эти 12 кепстральных коэффициентов дополняются динамическими признаками (дельта и дельта-дельта), описывающими изменения звукового сигнала. (Jurafsky, Martin. Speech and Language Processing, 2008). Полученный вектор значений носит название MFCC вектор (Mel-frequency cepstral coefficients) и является наиболее распространенным акустическим признаком, используемым в распознавании речи.

Что же происходит с признаками дальше? Они используются в качестве входных данных для акустической модели. Она показывает, какая лингвистическая единица, скорее всего, породила подобный MFCC вектор. В разных системах такими лингвистическими единицами могут служить части фонем, фонемы или даже слова. Таким образом, акустическая модель позволяет преобразовать последовательность MFCC векторов в последовательность наиболее вероятных фонем.

Далее для последовательности фонем необходимо подобрать соответствующую последовательность слов. Здесь в дело вступает словарь языка, содержащий транскрипцию всех распознаваемых системой слов. Составление подобных словарей трудоемкий процесс, требующий экспертных знаний в фонетики и фонологии конкретного языка. Пример строки из словаря транскрипций:

скважина s k v aa zh y n ay

На следующем этапе языковая модель определяет априорную вероятность предложения в языке. Другими словами, модель даёт оценку, насколько правдоподобно появление такого предложения в языке. Хорошая языковая модель определит, что фраза Построй график дебита нефти более вероятна, чем предложение Построй график девять нефти.

Комбинация акустической модели, языковой модели и словаря произношений создает решетку гипотез все возможные последовательности слов, из которых с помощью алгоритма динамического программирования можно найти наиболее вероятную. Её система и предложит в качестве распознанного текста.

image
Схематичное изображение работы системы распознавания речи

Изобретать велосипед и писать с нуля библиотеку для распознавания речи было бы нецелесообразно, поэтому наш выбор пал на фреймворк kaldi. Несомненным плюсом библиотеки является её гибкость, позволяющая при необходимости создавать и модифицировать все компоненты системы. Кроме того, лицензия Apache License 2.0 позволяет свободно использовать библиотеку в коммерческой разработке.

В качестве данных для обучения акустической модели использовался свободно распространяемый аудио датасет VoxForge. Для преобразования последовательности фонем в слова мы использовали словарь русского языка, предоставляемый библиотекой CMU Sphinx. Поскольку в словаре отсутствовало произношение терминов специфичных для нефтяной отрасли, на его основе с помощью утилиты g2p-seq2seq была обучена модель графемно-фонемного преобразования (grapheme-to-phoneme), позволяющая быстро создавать транскрипции для новых слов. Языковая модель обучалась как на транскриптах аудио с VoxForge, так и на созданном нами датасете, содержащим термины нефтегазовой отрасли, названия месторождений и добывающих обществ.

Выделение смысловых объектов

Итак, речь пользователя мы распознали, но ведь это всего лишь строчка текста. Как объяснить компьютеру, что необходимо выполнить? Самые первые системы голосового управления использовали жестко ограниченный набор команд. Распознав одну из таких фраз можно было вызвать соответствующую ей операцию. С тех пор технологии в сфере обработки и понимания естественного языка (NLP и NLU соответственно) шагнули далеко вперед. Уже сегодня модели, обученные на больших объемах данных, способны неплохо понимать смысл, заключенный в том или ином высказывании.

Чтобы выделить смысл из текста распознанной фразы, необходимо решить две задачи машинного обучения:
1. Классификация команды пользователя (Intent Classification).
2. Выделение именованных сущностей (Named Entity Recognition).
При разработке моделей мы использовали библиотеку с открытым исходным кодом Rasa, распространяемую под лицензией Apache License 2.0.

Чтобы решить первую задачу, необходимо представить текст в виде числового вектора, который может быть обработан машиной. Для подобного преобразования использована нейронная модель StarSpace, позволяющая вложить текст запроса и класс запроса в общее пространство.

image
Нейронная модель StarSpace

Во время обучения нейронная сеть учится сравнивать сущности, так чтобы минимизировать расстояние между вектором запроса и вектором верного класса и максимизировать расстояние до векторов отличных классов. Во время тестирования для запроса х выбирается класс у, так чтобы:
image
В качестве меры схожести векторов используется косинусное расстояние:
image
, где
х запрос пользователя, у категория запроса.

Для обучения классификатора намерений пользователя было размечено 3000 запросов. Всего у нас вышло 8 классов. Выборку мы разделили на обучающую и тестовую выборки в соотношении 70/30 с помощью метода стратификации по целевой переменной. Стратификация позволила сохранить исходное распределение классов в трейне и тесте. Качество обученной модели оценивалось сразу по нескольким критериям:
Полнота (Recall) доля верно классифицированных запросов относительно всех запросов данного класса.
Доля верно классифицированных запросов (Accuracy).
Точность (Precision) доля верно классифицированных запросов относительно всех запросов, которые система отнесла к данному классу.
Мера F1 гармоническое среднее между точностью и полнотой.

Также для оценки качества модели классификации используется матрица ошибок системы. По оси y проставлен истинный класс высказывания, по оси x класс, предсказанный алгоритмом.
На контрольной выборке модель показала следующие результаты:
image
Метрики модели на тестовом датасете: Accuracy 92%, F1 90%.

Вторая задача выделение именованных сущностей заключается в идентификации слов и словосочетаний, обозначающих конкретный предмет или явление. Такими сущностями могут быть, например, название месторождения или добывающего общества.

Для решения задачи использовался алгоритм условных вероятностных полей (Conditional Random Fields), представляющих собой разновидность Марковских полей. CRF является дискриминативной моделью, то есть моделирует условную вероятность P(Y|X) скрытого состояния Y (класс слова) от наблюдения X (слово).
Чтобы выполнять просьбы пользователей, нашему ассистенту необходимо выделять три типа именованных сущностей: название месторождения, имя скважины и наименование объекта разработки. Для обучения модели мы подготовили датасет и произвели аннотацию: каждому слову в выборке был присвоен соответствующий класс.
image
Пример из обучающей выборки для задачи Named Entity Recognition.

Однако всё оказалось не так просто. У разработчиков месторождений и геологов довольно распространены профессиональные жаргонизмы. Людям не составляет труда понять, что нагнеталка это нагнетательная скважина, а Самотлор, скорее всего, обозначает Самотлорское месторождение. Для модели же, обученной на ограниченном объеме данных, провести такую параллель пока трудно. Справиться с этим ограничением помогает такая замечательная фича библиотеки Rasa, как создание словаря синонимов.
## synonym: Самотлор
Самотлор
Самотлорское
самое большое месторождении нефти в России


Добавление синонимов также позволило немного расширить выборку. Объем всего датасета составил 2000 запросов, которые мы разделили на трейн и тест в соотношении 70/30. Качество модели оценивалось с помощью метрики F1 и составило 98% при тестировании на контрольной выборке.

Исполнение команд
В зависимости от класса запроса пользователя, определенного на предыдущем шаге, система активирует соответствующий класс в ядре программного обеспечения. Каждый класс обладает как минимум двумя методами: методом, непосредственно выполняющим запрос, и методом генерации ответа для пользователя.

Например, при отнесении команды к классу запрос_график_добычи создается объект класса RequestOilChart, выгружающий информацию по добыче нефти из базы данных. Выделенные именованные сущности (например, название скважины и месторождения) используются для заполнения слотов в запросах для обращения к базе данных или ядру программного обеспечения. Отвечает ассистент с помощью заготовленных шаблонов, пробелы в которых заполняются значениями выгруженных данных.

image
Пример работы прототипа ассистента.

Синтез речи
image
Схема работы конкатенативного синтеза речи

Сгенерированный на предыдущем этапе текст оповещения пользователя выводится на экран, а также используется в качестве входа для модуля синтеза устной речи. Генерация речи осуществляется с использованием библиотеки RHVoice. Лицензия GNU LGPL v2.1 позволяет использовать фреймворк в качестве компонента коммерческого ПО. Основными компонентами системы синтеза речи являются лингвистический процессор, который обрабатывает подаваемый на вход текст. Производится нормализация текста: цифры приводятся к письменному представлению, аббревиатуры расшифровываются и т. п. Далее с помощью словаря произношений происходит создание транскрипции для текста, которая далее передается на вход акустического процессора. Данный компонент отвечает за выбор звуковых элементов из речевой базы данных, конкатенацию выбранных элементов и обработку звукового сигнала.

Собираем всё воедино
Итак, все компоненты голосового помощника готовы. Осталось лишь собрать их в правильной последовательности и протестировать. Как мы упоминали ранее, каждый модуль представляет собой микросервис. В качестве шины для связки всех модулей используется фреймворк RabbitMQ. Иллюстрация наглядно демонстрирует внутреннюю работу ассистента на примере типичного запроса пользователя:
image

Созданное решение позволяет разместить всю инфраструктуру в сети Компании. Локальная обработка информации является главным достоинством системы. Однако платить за автономность приходится тем, что собирать данные, обучать и тестировать модели приходится самостоятельно, а не использовать мощь топовых вендоров на рынке цифровых ассистентов.

В данный момент мы занимаемся интеграцией помощника в один из разрабатываемых продуктов.
image
Как удобно будет искать свою скважину или любимый куст с помощью всего одной фразы!

На следующем этапе планируется сбор и анализ обратной связи от пользователей. Также в планах расширение команд, распознаваемых и выполняемых ассистентом.

Описанный в статье проект далеко не единственный пример использования методов машинного обучения в нашей Компании. Так, например, анализ данных применяется для автоматического подбора скважин-кандидатов на геолого-технические мероприятия, целью которых является интенсификации добычи нефти. В одной из ближайших статей мы расскажем, как решали эту крутую задачу. Подписывайтесь на наш блог, чтобы не пропустить!
Подробнее..

Нефтянка для инженеров, программистов, математиков и широких масс трудящихся, часть 5

06.08.2020 08:23:05 | Автор: admin

Сегодня мы поговорим о двух частных областях, где без моделирования не обойтись, и расскажем, как инженеры умеют разбираться в показаниях датчиков. Любая скважина это объект капитального строительства, как здание или завод, который требует капитальных вложений, планирования, периодического и капитального ремонта, и только при удовлетворении этих требований она сможет вернуть затраты на своё строительство и принести прибыль как в энергетическом, так и в денежном выражении. Жизнь скважины напрямую связана с периодически проводимыми на ней технологическими ремонтными операциями. Есть операции, как, например, спуск-подъём и замена труб или насоса, которые нуждаются только в наличии чёткого плана и соблюдении техники безопасности ремонтной бригадой. А есть операции особенные, требующие глубокой инженерной проработки и дополнительного моделирования, и без этих действий жизнь скважины может просто закончиться. А скважина, напомню это большое вложение средств и энергии.

Симулятор гидроразрыва пласта





Одной из самых важных на сегодня операций, проводимых на скважинах, является гидравлический разрыв пласта (ГРП). Суть гидроразрыва пласта в следующем. В скважину под большим давлением (до тысячи атмосфер!) закачивают специальную жидкость, похожую на желе (собственно, это и есть желе при его производстве используют пищевой гелеобразователь). Давление разрывает пласт, раздвигая слои породы. На той глубине, где обычно производится ГРП, породу проще раздвинуть в стороны, чем вверх, поэтому трещина получается почти плоская и вертикальная, при этом ширина её составляет считанные миллиметры или сантиметры. Затем вместе с жидкостью начинает подаваться пропант (иногда также пишут проппант, с двумя п и так, и так правильно) похожая на песок смесь крепких керамических гранул диаметром от долей миллиметров до миллиметров. Цель ГРП закачать нужное количество пропанта в пласт (а, точнее, в коллектор в ту часть пласта, где находится нефть) так, чтобы образовалась проницаемая область, соединённая со скважиной. Жидкость, конечно, утечёт в пласт, а пропант останется там, куда успел дойти. Низкопроницаемые месторождения (а сейчас почти все новые месторождения именно такие, все большие хорошие традиционные месторождения давно уже нашли и разбурили) бесполезно бурить обычными скважинами: проницаемость мала, и к маленькому стволу скважины нефть еле сочится. Можно, конечно, теоретически и скважину пробурить очень толстую, чтобы площадь стенок у неё была большая, но очевидно, что на практике это сделать нереально. А вот если сделать на скважине ГРП, то вокруг скважины образуется обширная, хорошо соединённая со скважиной трещина с большой площадью стенок. Нефть сочится так же медленно, как и раньше, но теперь скважина собирает её потихоньку с большой площади, и суммарный дебит получается хороший, и скважина экономически оправдана. Чтобы ещё увеличить площадь, с которой собирается одной скважиной нефть, скважины бурят горизонтально, и проводят ГРП несколько раз в разных местах горизонтального ствола.



Что тут может пойти не так, и зачем нужно моделирование? Во-первых, трещина может пойти не туда, куда нужно, и пропант может распределиться по ней не так, как нам бы хотелось. Месторождение могло разрабатываться уже давно, и часть слоёв породы уже обводнилась, насытилась водой, а, возможно, и с самого начала на месторождении нижние слои были водонасыщены. Если вдруг трещина пройдёт от скважины к водонасыщенным или газонасыщенным пластам и заполнится пропантом, то вместо части нефти скважина будет добывать воду или газ.

Во-вторых, пропант может застрять на входе в трещину, потому что жидкость, в которую он замешан, оказалось слишком маловязкой, или проницаемость пласта оказалась выше, чем вы планировали, и жидкость просто быстро утечёт, оставляя сплошной пропант, который, понятное дело, без жидкости отказывается двигаться. Тогда вся скважина окажется заполнена пропантом, и для её очистки потребуются дополнительные затраты на промывку.

Наконец, в-третьих, пропант может прокачаться дальше ствола скважины и потерять с ней контакт. Тогда хорошо проницаемая область хоть и будет создана, но со скважиной никак соединяться не будет, и тогда толку от её существования вообще никакого.



Как можно смоделировать то, что в скважине будет происходить при закачке под большим давлением жидкости и пропанта? Этим занимается специализированный софт под названием симулятор ГРП, который использует численную физико-математическую модель развития трещины. Разработка такого софта, как и разработка любого другого софта для численного моделирования физических процессов, требует одновременного участия физиков, математиков, программистов высокопроизводительных параллельных вычислений и программистов, умеющих создавать удобный интерфейс, потому что в конечном счёте симулятором ГРП будут пользоваться инженеры в болотах Западной Сибири, нещадно кусаемые комарами!

Программы, которые позволяют рассчитать ГРП, буквально по пальцам сосчитать, и все они, до недавнего времени, были сделаны только в одной стране мира и легко запрещались к продаже в России. Да, мы гордимся, что разработали и продолжаем развивать первый в нашей стране промышленный симулятор гидроразрыва пласта, РН-ГРИД. До нашей разработки не только мы, но и вся отечественная индустрия была вынуждена пользоваться только американским ПО, потому что другого, собственно, не было, а с 2014 года с покупкой этого ПО возникли проблемы (как говорится, не было бы счастья, да несчастье помогло). Сейчас РН-ГРИД не только полностью заменил всё аналогичное ПО внутри Роснефти, но и успешно продаётся сторонним компаниям.



Чтобы рассчитать трещину, нужна физико-математическая модель. Но какие физические явления должны быть включены в модель, а про какие можно забыть? Насосы на поверхности закачивают под давлением жидкость с замешанным в неё пропантом. Эта смесь поступает в трубу, под давлением и собственным весом спускается на глубину, по пути испытывая трение о стенки трубы, тормозясь из-за собственной вязкости и турбулентности, теряет часть своей энергии на перфорациях и, растачивая словно абразивом эти самые перфорации, поступает в трещину, продвигается по ней, раскрывая её всё шире и шире, прорывается в более слабые пропластки, застревает в узких местах и опускается вниз под действием гравитации, а потом отфильтровывается через стенки трещины во все стороны, оставляя пропант в трещине.



Движение смеси и раскрытие (а потом, после остановки закачки, и закрытие) трещины это всё единая задача, которая включает в себя и механику упругой деформации породы при раскрытии трещины, и гидродинамику движения смеси по трубам и внутри трещины, и множество частных задач вроде расчёта трения в трубах, распада желеобразного геля под действием специальной химии, торможение частиц пропанта друг о друга, растворение породы кислотой (если это не простой, а кислотный ГРП), прогрев жидкости породой и охлаждение породы жидкостью и ещё множество других эффектов. Оцените сами, сколько тут всего!



Таким образом, чтобы описать все эти процессы, нужно перебрать половину университетских учебников по физике и нехилую часть учебников по химии: механику сплошных сред и гидродинамику, термодинамику и динамику химических реакций. Описать мало, надо ещё и запрограммировать, и тут придётся обложиться учебниками по численным методам и думать, как дискретизировать задачу и не получить систему уравнений, не решаемую за осмысленное время. А потом засесть за мануалы Intel по процессорным инструкциям AVX2, чтобы ваш решатель систем нелинейных уравнений был лучшим в мире.

В итоге получится самый быстрый и самый навороченный в мире консольный exe-шник. Чтобы подать ему на вход все нужные данные, и красиво отобразить на выходе результаты расчёта, а потом еще и выгрузить их в отчет по нужной форме, понадобится ещё и такое удобное приложение, как пре-пост-процессор. Полевые инженеры, напомню, довольно суровые ребята, которые сидят ночами, интерпретируя графики и пересчитывая дизайны ГРП. Они всегда готовы высказать всё, что думают о режущем глаза шрифте или о кнопке в диалоге, которая уезжает за пределы экрана на старых ноутбучных мониторах 1024 на 768, которые ты, программист, развалясь в своём уютном офисе за парой 4К мониторов, забыл предусмотреть. А так как работа идёт и днём, и ночью, они тоже очень любят тёмную тему:



Нужно учитывать, что всё описываемое происходит на глубине нескольких километров, и всё, что видят инженеры при проведении ГРП это показания нескольких приборов на поверхности и иногда показания пары приборов, спущенных в скважину. Поэтому инженерам важно заранее запланировать с помощью модели то, что будет происходить, затем во время операции по показаниям приборов вовремя увидеть, идёт ли всё по плану, вовремя реагировать на нештатные ситуации, а после операции построить ретроспективную модель того, как ГРП был выполнен, чтобы полученную информацию можно было использовать на соседней скважине или на соседнем месторождении. Про показания приборов мы ещё скажем ниже, потому что этот модуль нужен на всех технологических операциях.

Симулятор операций с гибкой трубой



В хирургии с незапамятных времён привыкли к операциям, выполняемым через вену, а медицинские эндоскопы тоже давно и успешно используются для исследования и манипуляций со всякими внутренними органами человека. В нефтянке есть свой аналог этой операции это гибкая насосно-компрессорная труба (ГНКТ) меньшего диаметра, которая спускается внутрь обычной насосно-компрессорной трубы и позволяет выполнять разного рода работы, которые иначе выполнять сложно.



Как используют гибкую трубу? Основных вариантов два. Это может быть просто гибкая труба с открытым концом. Её спускают в обычную трубу, по которой до того осуществлялась закачка или добыча, и начинают через неё закачивать жидкость и газ. Но при этом хотят, чтобы они не уходили в пласт, а поднимались по трубе обратно. Посмотрите на схему, и вам станет понятна идея: в трубу 1 засунута труба 2, по трубе 2 подаётся жидкость и газ, а между трубой 1 и трубой 2 закачанные жидкость и газ поднимаются обратно на поверхность. Зачем это нужно? Например, если основная труба 1 была в результате предыдущей неудачной операции забита до половины пропантом, её таким образом можно промыть: пропант будет с обратным током жидкости и газа выноситься обратно на поверхность это называется промывка ствола. Например, если соединение скважины с пластом забилось и плохо пропускает нефть, можно закачивать вместе с жидкостью больше азота, тогда пластовое давление жидкости само прочистит призабойную область. Управляя давлением на входе в трубу 2 и на выходе из трубы 1 можно добиваться, чтобы циркулирующая жидкость не уходила в пласт, потому что нам нужно промыть скважину а можно, чтобы, наоборот, уходила, если мы закачиваем кислоту, чтобы подрастворить породу или нежелательные загрязнения вокруг скважины.

Второй вариант ещё проще на низ трубы 2 насаживается какой-нибудь ёршик инструмент, например, фреза с приводом от потока закачиваемой жидкости, и с её помощью, например, рассверливается какое-нибудь препятствие в трубе 1. В любом случае, это тонкая гибкая металлическая труба, которая разматывается с катушки на машине и спускается в ту трубу, которая уже спущена в скважину. Вот на картинке и катушка с трубой, и кран, и характерная гусиная шея (так называемый гузнек) для того, чтобы не перегибать трубу слишком сильно, направляя в скважину.



Мы в нашем институте сейчас разрабатываем наше ПО для проведения расчётов различных операций, производимых через гибкую трубу РН-ВЕКТОР. Угадаете, где сделан массово применяемый на просторах РФ аналог, который сейчас приходится использовать инженерам?

Что здесь нужно моделировать? Во-первых, нагрузки на гибкую трубу. Её будут спускать в другую трубу, она будет там тереться о стенки, и сначала её нужно будет заталкивать с дополнительным усилием, а потом наоборот, удерживать. Но даже когда в скважину будет спущено 2-3 километра трубы, все эти 2-3 километра будут находиться в очень разных условиях: верхняя часть будет висеть и под собственным весом растягиваться, а нижняя часть, ушедшая в горизонтальный ствол, будет лежать и стараться застрять. Соответственно, важно рассчитать, чтобы нигде и не застряло, и не порвалось. Расчёт разнообразных нагрузок в соответствии с весом гибкой трубы и её трением о стенки основной трубы, гулянием трубы по спирали и механическими свойствами стали это первая часть любого такого продукта.

Во-вторых, гидравлика. На входе в гибкую трубу одно давление, которое теряется сначала при движении жидкости по намотанной на бобину трубе, потом теряется при движении по гибкой трубе вниз, превращается в какое-то давление внизу. Если вдруг внизу окажется давление больше, чем в пласте, жидкость будет уходить в пласт, теряться, вместо того, чтобы уходить наверх между трубами 1 и 2 на рисунке выше. Уважаемый мастер бригады Иван Иванович, скажет рабочий бригады ГНКТ, несомненно, мы наблюдаем потерю циркуляции, как Вы считаете?. Если наоборот, окажется меньше, то из пласта будет сквозить нефть, а мы же ремонт на скважине делаем, а не добычей занимаемся. Так что симулятор этой технологической операции должен уметь правильно рассчитывать все перепады давления. Кстати, а давление в гибкой трубе обратно влияет на её нагруженное состояние.



В-третьих, вынос частиц. На рисунке выше представьте себе взбаламученный песок на дне скважины: будет ли он потоком жидкости подниматься наверх, или скорости потока не хватит, и он будет падать обратно вниз? А если закачивать жидкость вместе с азотом азотный пузырь быстрее воду наверх выталкивает, особенно расширяясь на пути снизу вверх, но при этом сам песок выносить не может. Как много взбаламученного песка можно вынести наверх и при этом не уронить пачку? Нужен расчёт, причём с разными режимами течения.

В-четвертых, нужен учёт усталости трубы. Гибкая труба распрямляется с барабана, снова сгибается на гузнеке, потом снова распрямляется на входе в скважину а потом всё в обратном порядке. Трубу то спускают, то поднимают, соответственно, какие-то её части сгибаются больше, какие-то меньше. Сталь трубы рассчитана на определённую накопленную усталость, и нужно от работы к работе рассчитывать очередную добавку усталости каждого метра трубы и хранить этот профиль в базе данных. Вот как выглядит этот профиль, после определённого числа работ:



Да, конечно, дефектоскоп никто не отменял, и он возможные нарушения в трубе найдёт и покажет, но проверять на нём трубу после каждой работы технически невозможно или очень дорого.

Графики, графики, графики!



Всё железо, используемое что во время операции с гибкой трубой, что во время операции гидроразрыва пласта, обвешано датчиками, где-то больше, где-то поменьше. Во время операции все данные, конечно же, записываются в файл или в базу данных, но параллельно инженерам нужно настроить себе удобный внешний вид для всех показателей, чтобы и глаза не резало, и все показатели были на виду.



А вот после окончания операции файл с данными импортируется, и все графики отображаются и вдумчиво анализируются, и не важно, была это работа с гибкой трубой или гидроразрыв пласта. А когда программисты и инженеры отдыхают, они берут свой любимый софт и загружают в него телеметрию любимого квадрокоптера (потому что никакой другой известный софт почему-то не работает так классно с длинными рядами данных):



Но мы отклонились от темы. Вот, например, как может выглядеть в том же самом софте записанная операция ГРП:



Смотрит грамотный инженер на эти графики, и вся картина произошедшего разворачивается перед ним, как линии судьбы на ладони. В точке 1 началась закачка, и забойное давление (давление внизу скважины) начинает резко расти с точки 2 до точки 3, пока, наконец, при давлении 380 атмосфер не открывается трещина гидроразрыва. Обратите внимание, что давление внизу у скважины так и останется почти постоянным, пока трещина будет расти вплоть до точки 11. Кстати, когда трещина открывается при 380 атмосферах, на поверхности манометр показывает более 500 атмосфер в точке 4. Давление в трещине остаётся почти постоянным, а на поверхности показания манометра падают из точки 4 в точку 5. Инженер и глазом не поведёт: он отлично знает, что это почти вода в скважине замещается на тот самый гель, и потери давления на трение в трубе падают именно на разницу между точками 4 и 5. Пытливый инженер даже измерит наклон линии от точки 4 к точке 5, и получит таким образом отношение коэффициентов трения у жидкости, которая была в скважине и которая туда поступает.

В точке 6 начинает подаваться пропант, и смотрите как сразу в точке 7 начинают падать показания манометра на поверхности это столб жидкости в скважине из-за пропанта становится всё тяжелее и тяжелее. В точке 8 до точки 9 в скважину подбавили понизитель трения, чтобы пропант не слишком сильно тормозился о стенки трубы. В точке 10 перестали подавать пропант, он перестал под своим весом проваливаться в скважину, и поэтому сильнее приходится давлением его продавливать в трещину, устьевое давление возрастает до точки 11. А там насосы выключают, и давление мгновенно падает к точке 12, и там уже начинает медленно снижаться по мере того, как из трещины гидроразрыва утекает жизнь жидкость, и она постепенно закрывается.

Все эти графики дают множество информации инженеру, который не может видеть явно, что там происходит на глубине, но благодаря знаниям, может не только качественно оценить то, что происходит, но и количественно оценить многие показатели. Намеренно оставим за скобками то, что называется анализы тестовых закачек, где к этим графикам прикладывают всякие хитрые линейки и с их помощью вычисляют многие неизвестные параметры пласта. Думаю, и так понятно, насколько обширное поле деятельности для математиков, физиков, программистов и технарей всех мастей представляет собой разработка инженерного ПО!
Подробнее..

Пан или пропант. Роснефть интригует программистов

13.08.2020 10:12:29 | Автор: admin
image
Этой осенью Роснефть организует открытый марафон ИТ-соревнований для программистов. Марафон пройдёт с сентября по ноябрь. Магическое число этого ивента 3: 3 соревнования, 3 задачи, 3 победителя в каждом из конкурсов и 3 призовых фонда.


Итак, в нашем меню для гурманов Хабра: Хакатон трёх городов по машинному обучению, Хакатон для программистов-робототехников и Rosneft Proppant Check Challenge. Машинного обучения, роботов и пропанта хватит на всех!

Стать участниками ИТ-марафона может айтишная братия, достигшая совершеннолетия (18+). Ставим на студентов техвузов, аспирантов, молодых спецов и иже с ними. Регистрация на соревнования уже идёт полным ходом на сайте.

image

По порядку. Хакатон трёх городов по машинному обучению пройдёт 24-25 сентября одновременно в трёх городах: в Уфе, Казани и Самаре. Нашей талантливой молодёжи предстоит разработать алгоритм для построения пути движения на сложной поверхности. Похожие задачи возникают во многих прикладных областях, связанных с геологией, сейсморазведкой, трубопроводным транспортом и нефтепереработкой. Приз за самое оперативное и качественное решение 289 000 рублей*.

Хакатон для программистов-робототехников пройдёт 16-17 октября в Уфе на базе УГАТУ. Задача подразумевает техническое творчество: необходимо разработать роботизированное решение для выполнения операции, связанной с текущей производственной деятельностью по обслуживанию технологического оборудования. При этом мы вооружим участников настоящим роботом-манипулятором и трудолюбивым 3D-принтером. Призовой фонд для любителей роботов 139 000 рублей*.

image

Завершающим мероприятием ИТ-марафона станет международное соревнование Rosneft Proppant Check Challenge, которое стартует в сентябре как для опытных ИТ-специалистов, так и для начинающих (не только из России, но и за пределами нашей необъятной страны). Задача очень серьёзная: определение распределения линейных размеров зёрен пропанта по серии фотографий. В идеале получить уникальный алгоритм для определения характеристик пропанта по фотографии без каких-либо лабораторных исследований. Естественно, целью не является замена исследований как таковых, но в обозримом будущем реализованный алгоритм может быть применен как онлайн метод проверки качества пропанта на линиях производства, что повысит уровень контроля качества выпускаемой продукции. Тут придётся выложиться по максимуму. Но и призовой фонд весьма достойный 1 142 000 рублей*.
* До уплаты налогов
image

Финал ИТ-марафона состоится 28 ноября (дата предварительная) в Москве, где будут подведены итоги Rosneft Proppant Check Challenge, и куда мы пригласим победителей всех трёх хакатонов.

Кого точно не будет в марафоне Роснефти, так это проигравших: участие в масштабном мероприятии нефтяного лидера позволит молодым и амбициозным айтишникам оценить свои возможности на рынке, добавить веса своему резюме, стать претендентами на будущие вакансии и найти единомышленников для обмена знаниями и совместных проектов. Цифровые месторождения, робототехника, программное обеспечение, 3D-технологии, искусственный интеллект всё это, понятное дело, возможно не само по себе. Новую реальность, в том числе для нефтегаза, создают уникальные люди с их уникальными мозгами. Чтобы привлечь внимание этих гениев, надо заинтересовать и вовлечь их в решение действительно важных задач, которые будут впоследствии внедрены на практике.

ИТ-марафон Роснефти это не светские мероприятия для ИТ-специалистов и не ярмарка тщеславия. Это действующий инструмент получения лучших идей и алгоритмов, необходимых для совершенствования существующего наукоёмкого программного обеспечения нефтяной компании.

image

Например, подходы победителей прошлогоднего соревнования Rosneft Seismic Challenge уже подготовлены в виде пилотной версии для промышленного внедрения в сейсмическую часть корпоративного ПО Роснефти. Это ПО позволит автоматизировать огромное количество ручных операций интерпретаторов сейсмических данных, а значит, мы сможем более эффективно распоряжаться интеллектуальными ресурсами, так как появится больше времени для анализа и понимания особенностей геологического строения объекта сейсмосъёмки, что пока машинам недоступно.

Кстати, если вы пропустили прошлогоднюю сейсмическую феерию Роснефти, то по ссылке ролик с финала Rosneft Seismic Challenge.

Проведение марафона ИТ-соревнований не является самоцелью. Роснефть рассматривает цифровизацию и развитие ИТ-технологий не только как стратегическую возможность повышения экономической эффективности производства, но и как точку соприкосновения целей Компании и интересов российского ИТ-сообщества в области искусственного интеллекта и роботизации производства. И только привлечение к сотрудничеству высококвалифицированные кадры узкопрофессиональной сферы может задать нефтянке импульс к модернизации производства.

Нам нужны специалисты с нестандартным мышлением, способные решать серьёзные и нестандартные задачи. Вы именно такой(ая)? Тогда бегом к нам.

image

P. S. По этой ссылке источник вдохновения для будущих участников ИТ-марафона видеопожелания финалистов прошлогоднего Rosneft Seismic Challenge
Подробнее..

Подбор скважин-кандидатов для гидравлического разрыва пласта с использованием методов машинного обучения

11.09.2020 10:13:26 | Автор: admin
image

Сегодня мы расскажем, как разрабатывали систему поиска скважин-кандидатов для гидравлического разрыва пласта (ГРП) с использованием машинного обучения (далее ML) и что из этого вышло. Разберёмся, зачем делать гидравлический разрыв пласта, при чём здесь ML, и почему наш опыт может оказаться полезен не только нефтяникам.

Под катом подробная постановка задачи, описание наших IT решений, выбор метрик, создание ML конвейера, разработка архитектуры для выпуска модели в прод.

Зачем делать ГРП мы писали в наших предыдущих статьях тут и тут.

Зачем здесь машинное обучение? ГРП с одной стороны хоть и дешевле бурения, но всё равно мероприятие затратное, а с другой его не получится делать на каждой скважине не будет эффекта. Поиском подходящих мест занимается эксперт-геолог. Поскольку количество действующих велико (десятки тысяч) нередко варианты упускаются из виду, и Компания недополучает возможную прибыль. Значительно ускорить анализ информации позволяет использование машинного обучения. Однако создать ML модель это лишь полдела. Нужно заставить её работать в постоянном режиме, связать с сервисом данных, нарисовать красивый интерфейс и сделать так, чтобы пользователю было удобно зайти в приложение и решить свою проблему в два клика.

Абстрагируясь от нефтянки, можно заметить, что подобные задачи решаются во всех компаниях. Все хотят:

A. Автоматизировать обработку и анализ большого потока данных.
B. Уменьшить затраты и не упускать выгоду.
C. Сделать такую систему быстро и эффективно.

Из статьи вы узнаете, как мы реализовали подобную систему, какие инструменты использовали, а также какие шишки набили на тернистом пути внедрения ML в производство. Уверены, что наш опыт может быть интересен всем, кто хочет автоматизировать рутину вне зависимости от сферы деятельности.

Как происходит подбор скважин на ГРП традиционным способом

При подборе скважин-кандидатов на ГРП нефтяник опирается на свой большой опыт и смотрит на разные графики и таблицы, после чего прогнозирует, где сделать ГРП. Достоверно, однако, никто не знает, что творится на глубине нескольких тысяч метров, ведь взглянуть под землю так просто не получается (подробнее можно почитать в предыдущей статье). Анализ данных традиционными методами требует значительных трудозатрат, но, к сожалению, не даёт гарантии точного прогноза результатов ГРП (спойлер с ML тоже).

Если описать текущий процесс определения скважин-кандидатов на ГРП, то он будет состоять из следующих этапов: выгрузка данных по скважинам из корпоративных информационных систем, обработка полученных данных, проведение экспертного анализа, согласование решения, проведение ГРП, анализ результатов. Выглядит просто, но не совсем.

image
Текущий процесс подбора скважин-кандидатов

Основной минус подобного ручного подхода много рутины, объёмы растут, люди начинают тонуть в работе, отсутствует прозрачность в процессе и методах.

Постановка задачи

В 2019 году перед нашей командой по анализу данных встала задача создать автоматизированную систему по подбору скважин-кандидатов на ГРП. Для нас это звучало так смоделировать состояние всех скважин, предположив, что прямо сейчас на них необходимо произвести операцию ГРП, после чего отранжировать скважины по наибольшему приросту добычи нефти и выбрать Топ-N скважин, на которые поедет флот и проведёт мероприятия по увеличению нефтеотдачи.

С помощью ML моделей формируются показатели, которые говорят о целесообразности проведения ГРП на конкретной скважине: дебит нефти после планируемого ГРП и успешность данного мероприятия.

В нашем случае дебит нефти представляет собой количество добытой нефти в метрах кубических за 1 месяц. Данный показатель рассчитывается на основе двух величин: дебита жидкости и обводнённости. Жидкостью нефтяники называют смесь нефти и воды именно эта смесь является продукцией скважин. А обводнённость это доля содержания воды в данной смеси. Для того чтобы рассчитать ожидаемый дебит нефти после ГРП, используются две модели регрессии: одна прогнозирует дебит жидкости после ГРП, другая прогнозирует обводнённость. С помощью значений, которые возвращают данные модели, рассчитываются прогнозы дебита нефти по формуле:

image

Успешность ГРП это бинарная целевая переменная. Она определяется с помощью фактического значения прироста дебита нефти, который получили после ГРП. Если прирост больше некоего порога, определённого экспертом в доменной области, то значение признака успешности равно единице, в противном случае оно равно нулю. Таким образом мы формируем разметку для решения задачи классификации.

Что касается метрики Метрика должна идти от бизнеса и отражать интересы заказчика, говорят нам любые курсы по машинному обучению. По нашему мнению здесь кроется главный успех или неуспех проекта по машинному обучению. Группа датасайнтистов может сколь угодно долго улучшать качество модели, но если она никак не повышает бизнес-ценность для заказчика такая модель обречена. Ведь заказчику было важно получить точно кандидата с физичными прогнозами параметров работы скважины после ГРП.

Для задачи регрессии были выбраны следующие метрики:

image

Почему метрика не одна, спросите вы каждая отражает свою правду. Для месторождений, где средние дебиты высокие, МАЕ будет большим, а МАРЕ маленьким. Если взять месторождение с низкими средними дебитами, картина будет противоположной.

Для задачи классификации выбраны следующие метрики:

image
(вики),

Площадь под кривой ROCAUC (вики).

Ошибки, с которыми мы столкнулись

Ошибка 1 построить одну универсальную модель для всех месторождений.

После анализа датасетов стало понятно, что данные меняются от одного месторождения к другому. Оно и неудивительно, так как месторождения, как правило, имеют разное геологическое строение.
Наше предположение, что если взять и загнать все имеющиеся данные для обучения в модель, то она сама выявит закономерности геологического строения, провалилось. Модель, обученная на данных конкретного месторождения, показывала более высокое качество прогнозов, нежели модель, для создания которой использовалась информация обо всех имеющихся месторождениях.
Для каждого месторождения тестировались разные алгоритмы машинного обучения и по результатам кросс-валидации выбирался один с наименьшей MAPE.

image

Ошибка 2 отсутствие глубокого понимания данных.

Хочешь сделать хорошую модель машинного обучения для реального физического процесса пойми, как этот процесс происходит.

Изначально в нашей команде не было доменного эксперта, и мы двигались хаотично. Не замечали, увы, ошибок модели при анализе прогнозов, делали неправильные выводы на основе результатов.
Ошибка 3 отсутствие инфраструктуры.

Сперва мы выгружали много различных csv файлов для разных месторождений и разных показателей. В определённый момент файлов и моделей накопилось невыносимо много. Стало невозможно воспроизвести уже проведённые эксперименты, терялись файлы, возникала путаница.

1. ТЕХНИЧЕСКАЯ ЧАСТЬ

На сегодняшний день наша система автоподбора кандидатов выглядит следующим образом:

image

Каждый компонент представляет собой изолированный контейнер, который выполняет определённую функцию.

2.1 ETL = Загрузка данных

Всё начинается с данных. Особенно, если мы хотим построить модель машинного обучения. В качестве интеграционной системы мы выбрали Pentaho Data Integration.

image
Скриншот одной из трансформаций

Основные плюсы:

  • бесплатная система;
  • большой выбор компонент для подключения к различным источникам данных и трансформации потока данных;
  • наличие веб-интерфейса;
  • возможность управлять через REST API;
  • логирование.

Плюс ко всему перечисленному у нас был большой опыт разработки интеграций на данном продукте. Почему нужна интеграция данных в проектах ML? В процессе подготовки датасетов постоянно требуется реализовать сложные расчёты, привести данные к единому виду, по пути рассчитать новые признаки средние, изменения параметров во времени и т. д.

Для каждого факта ГРП выгружается более 400 параметров, описывающих работу скважины на момент проведения мероприятия, работу соседних скважин, а также информацию о проведённых ранее ГРП. Далее происходит преобразование и предобработка данных.

В качестве хранилища обработанных данных мы выбрали PostgreSQL. У него большой набор методов для работы с json. Так как мы храним итоговые датасеты в данном формате это стало решающим фактором.

Проект машинного обучения связан с постоянным изменением входных данных в силу добавления новых признаков, поэтому в качестве схемы базы данных используется Data Vault (ссылка на вики). Эта схема построения хранилищ позволяет быстро добавлять новые данные об объекте и не нарушать целостность таблиц и запросов.

2.2 Сервисы данных и моделей

После причёсывания и расчёта нужных показателей данные заливаются в БД. Здесь они хранятся и ждут, когда датасайнтист возьмёт их для создания ML модели. Для этого существует DataService сервис, написанный на Python и использующий gRPC протокол. Он позволяет получать датасеты и их метаданные (типы признаков, их описание, размер датасета и т. п.), загружать и выгружать прогнозы, управлять параметрами фильтрации и деления на train/test. Прогнозы в базе хранятся в формате json, что позволяет быстро получать данные и хранить не только значение прогноза, но и влияние каждого признака на этот конкретный прогноз.

image
Пример proto файла для сервиса данных.

Когда модель создана, её следует сохранить для этих целей используется ModelService, также написанный на Python с gRPC. Возможности этого сервиса не ограничиваются сохранением и загрузкой модели. Кроме того, он позволяет мониторить метрики, важность признаков, а также осуществляет связку модель + датасет, для последующего автоматического создания прогноза при появлении новых данных.

image
Примерно так выглядит структура нашего сервиса моделей.

2.3 ML модель

В определённый момент наша команда поняла, что автоматизация должна коснуться и создания ML моделей. Такая потребность была обусловлена необходимостью ускорения процесса создания прогнозов и проверки гипотез. И мы приняли решение разработать и внедрить в наш конвейер собственную библиотеку AutoML.

Изначально рассматривалась возможность использования готовых AutoML библиотек, однако существующие решения оказались недостаточно гибкими для нашей задачи и не обладали всем нужным функционалом сразу (по просьбам трудящихся можем написать отдельную статью о нашем AutoML). Отметим лишь, что разработанный нами фреймворк содержит классы, используемые для предобработки датасета, генерации и отбора признаков. В качестве моделей машинного обучения используется привычный набор алгоритмов, которые наиболее успешно применялись нами ранее: реализации градиентного бустинга из библиотек xgboost, catboost, случайный лес из Sklearn, полносвязная нейронная сеть на Pytorch и т. д. После обучения AutoML возвращает sklearn пайплайн, который включает в себя упомянутые классы, а также ML модель, которая показала наилучший результат на кросс-валидации по выбранной метрике.

Помимо модели формируется и отчёт о влиянии каких-либо признаков на конкретный прогноз. Такой отчёт позволяет геологам заглянуть под капот таинственного чёрного ящика. Таким образом, AutoML получает размеченный датасет с помощью DataService и после обучения формирует конечную модель. Далее мы можем получить окончательную оценку качества модели, загрузив тестовый датасет, сформировав прогнозы и рассчитав метрики качества. Завершающим этапом является выгрузка бинарного файла сформированной модели, её описания, метрик на ModelService, в то время как прогнозы и информация о влиянии признаков возвращаются на DataService.

Итак, наша модель помещена в пробирку и готова к запуску в прод. В любое время мы можем с её помощью сформировать прогнозы на новых, актуальных данных.

2.4 Интерфейс

Конечный пользователь нашего продукта это геолог, и ему надо как-то взаимодействовать с ML моделью. Наиболее удобный для него способ это модуль в специализированном ПО. Его-то мы и реализовали.

Фронтенд, доступный нашему пользователю, выглядит как интернет-магазин: можно выбрать нужное месторождение и получить список наиболее вероятных успешных скважин. В карточке скважины пользователь видит прогнозируемый прирост после ГРП и сам решает, хочет ли он добавить его в корзину и рассмотреть подробнее.

image
Интерфейс модуля в приложении.

image
Так выглядит карточка скважины в приложении.

Помимо прогнозируемых приростов по нефти и жидкости, пользователь также может узнать, какие признаки повлияли на предлагаемый результат. Важность признаков рассчитывается на этапе создания модели с помощью метода shap, а затем подгружается в интерфейс ПО с DataService.

image

В приложении наглядно показаны, какие признаки оказались наиболее важными для прогнозов модели.

Также пользователь может посмотреть на аналоги интересующей скважины. Поиск аналогов реализован на стороне клиента с помощью алгоритма K-d дерево.

image

Модуль выводит скважины, схожие по геологическим параметрам.

2. КАК М УЛУЧШАЛИ ML МОДЕЛЬ

image

Казалось бы, стоит запустить AutoML на имеющихся данных, и будет нам счастье. Но бывает так, что качество прогнозов, получаемых автоматическим способом, не идёт ни в какое сравнение с результатами датасайнтистов. Дело в том, что для улучшения моделей аналитики нередко выдвигают и проверяют различные гипотезы. Если идея позволяет улучшить точность прогнозирования на реальных данных, она реализуется и в AutoML. Таким образом, добавляя новые фичи, мы усовершенствовали автоматическое прогнозирование настолько, чтобы перейти к созданию моделей и прогнозов с минимальной включённостью аналитиков. Вот несколько гипотез, которые были проверены и внедрены в наш AutoML:

1. Изменение метода заполнения пропусков

В самых первых моделях мы заполняли почти все пропуски в признаках средним, кроме категориальных для них использовалась самое часто встречающееся значение. В дальнейшем, при совместной работе аналитиков и эксперта, в доменной области удалось подобрать наиболее подходящие значения для заполнения пропусков в 80% признаков. Также мы испробовали ещё несколько методов заполнения пропусков с использованием библиотек sklearn и missingpy. Наилучшие результаты дали заполнение константой и KNNImputer до 5% MAPE.

image
Результаты эксперимента по заполнению пропусков различными методами.

2. Генерация признаков

Добавление новых признаков для нас итеративный процесс. Для улучшения моделей мы стараемся добавлять новые признаки на основе рекомендаций доменного эксперта, на основе опыта из научных статей и наших собственных выводов из данных.

image
Проверка гипотез, выдвигаемых командой, помогает вводить новые признаки.

Одними из первых стали признаки, выделенные на основе кластеризации. По сути, мы просто выделили в датасете кластеры на основе геологических параметров и сгенерировали основные статистики по другим признакам на основе кластеров это дало небольшой прирост в качестве.

image
Процесс создания признака на основе выделения кластеров.

Также мы добавляли признаки, придуманные нами при погружении в доменную область: накопленная добыча нефти, нормированная на возраст скважины в месяцах, накопленная закачка, нормированная на возраст скважины в месяцах, параметры, входящие в формулу Дюпюи. А вот генерация стандартного набора из PolynomialFeatures из sklearn прироста в качестве нам не дала.

3. Отбор признаков

Отбор признаков мы производили многократно: как вручную вместе с доменным экспертом, так и используя стандартные методы feature selection. После нескольких итераций нами было принято решение убрать из данных некоторые признаки, не влияющие на таргет. Таким образом, нам удалось уменьшить размерность датасета, сохранив при этом прежнее качество, что позволило значительно ускорить создание моделей.

А теперь про полученные метрики...

На одном из месторождений мы получили следующие показатели качества моделей:

image

Стоит отметить, что результат выполнения ГРП также зависит от ряда внешних факторов, которые не прогнозируются. Поэтому о снижении МАРЕ до 0 говорить нельзя.

Заключение

Подбор скважин-кандидатов для ГРП с использованием ML амбициозный проект, объединивший в команду 7 человек: дата инженеров, датасайнтистов, доменных экспертов и менеджеров. Сегодня проект фактически готов к запуску и уже проходит апробацию на нескольких дочерних обществах Компании.

Компания открыта для экспериментов, поэтому из списка были выбраны около 20 скважин, и на них провели операции гидроразрыва. Отклонение прогноза с фактическим значением запускного дебита нефти (МАРЕ) составило около 10%. И это очень неплохой результат!

Не будем лукавить: особенно на начальном этапе несколько предложенных нами скважин оказались неподходящими вариантами.

Пишите вопросы и комментарии постараемся на них ответить.

Подписывайтесь на наш блог, у нас есть ещё много интересных идей и проектов, о которых мы обязательно напишем!
Подробнее..

Как с помощью хакатона столкнуть математиков и MLщиков, и кто тогда победит

28.11.2020 12:19:52 | Автор: admin

Введение



Эта статья о том, как мы совместно с роснефтёвой дочкой Самаранефтехимпроект и Казанским Федеральным Университетом в сентябре 2020 года провели Хакатон трёх городов, на котором предложили студентам решить классическую задачу сейсмической корреляции отражающих горизонтов. С такими задачами постоянно сталкиваются специалисты по сейсморазведке по всему миру. Для участников задачу решили преподнести как задачу поиска оптимального пути, чтобы не отпугнуть студентов страшными словами. В статье расскажем подробнее про задачу и разберём интересные решения участников. Это будет увлекательно для специалистов как по прикладному математическому моделированию, так и машинному обучению и анализу данных.


Организационная часть


Интересные подробности организации онлайн-хакатона в трёх городах мы рассказали в статье на vc.ru Нефтянка и хакатон. Марафон это не только бег.
Упомянем лишь, что для онлайн-формата мы выбрали сервис Discord и оставим ссылку на правила хакатона (ссылка на площадке Boosters).

Постановка задачи


В сейсморазведке существует понятие сейсмический отражающий горизонт это устойчивая по динамике и площади распространения отражённая волна, которая соответствует определённой геологической границе. Корректно проведя обработку полевых сейсмических данных и распознав (специалисты по сейсморазведке говорят проинтерпретировав) сейсмические горизонты, можно с точностью до 5-10 метров определить глубины их залегания. Определив глубины, далее можно уже вместе с геологами привязать данные горизонты к геохронологической шкале (Геохронологическая шкала Википедия) и распознать их более мелких собратьев. А после чего решать между какими горизонтами могут залегать ловушки с нефтью, как выглядит рельеф структурной модели месторождения и др.

image

Вертикальные сечения сейсмического куба и распознанные сейсмические отражающие горизонты

На практике горизонты выделяются послойно на сейсмических разрезах сейсмического куба как вручную, с помощью расстановки (специалисты по сейсморазведке говорят пикирования) большого числа реперных точек, так и с помощью автоматизированных и полуавтоматизированных процедур поиска. Безусловно, качественное решение задачи интерпретации сейсмических горизонтов с помощью программного обеспечения крайне востребовано и позволяет существенно снизить временные затраты специалистов по сейсморазведке.
В то же время, изучение источников (Least-squares horizons with local slopes and multi-grid correlations, Waveform Embedding: automatic horizon picking with unsupervised deep learning) показывает, что разработанные алгоритмы и решения основаны на небольшом числе математических подходов, поэтому мы решили попробовать привлечь студентов с их ещё не затуманенным научными изысканиями сознанием и предложить им данную задачу в форме задачи поиска оптимального пути на сложной поверхности.
В итоге задача была сформулирована так: построение пути движения на сложной поверхности, проходящего через заданные точки и удовлетворяющего условиям минимума некоторого функционала, зависящего от длины пути и его углов (градиентов).

image
Пример части исходного сейсмического разреза для построения горизонта. Зеленая линия заранее известная часть, красная искомая.

Участникам соревнования предстояло за 12 часов найти решение, позволяющее продолжить путь по оптимальной траектории на скрытой части датасета. На валидацию решения предоставлялось 20 попыток, побеждал участник с минимальным значением метрики.

Подробное описание данных
Ниже подробное описание данных, которые были доступны участнику:
image

image
Визуализация всех данных, которые были доступны участнику 2 сейсмических среза с горизонтами.

По-простому, участнику надо было продолжить hor_2 в области L1. Область L2 представляла собой перпендикулярный срез L1. Мы её добавили для генерации участниками дополнительных знаний. Но, к сожалению, она не пригодилась участникам.


На протяжении соревнования турнирная таблица строилась на основе значений метрики на публичной части тестовых данных. После окончания соревнования значение метрики было пересчитано на приватной части, и турнирная таблица была обновлена. Это важно для того, чтобы получить устойчивые решения, то есть не только подогнанные под публичные данные, но и способные показать сопоставимый результат на приватных. Оказалось, что это было сделано не зря, и после финальной оценки качества турнирная таблица изменилась.
Для количественной оценки полученных результатов использовалась следующая метрика:

$F(y ,z)=i=0Nyi pred-yi etalon2+zi,yi pred-zi,yi etalon2$

где:
N размерность искомого горизонта;
yi pred координаты горизонта, полученного с помощью алгоритма, i0,N;
yi etalon координаты эталонного горизонта;
zi,yi значения карты поверхности в точке с координатамиi,yi;
yi =yiheight, где height максимально возможное значение координаты y карты поверхности;
zi,yi=zi,yimax(z), где max(z) наибольшее значение карты поверхности.

Реализация метрики в Python
image


Какие методы применяли команды



Задача подбиралась изначально такой, которую можно было бы решить несколькими способами: прямым и обратным (классическими математическими методами и методами машинного обучения соответственно).
С точки зрения машинного обучения задачу можно решать двумя методами:
1) Построение регрессии
Используя известные пары точек (xi,yi), можно построить отображение f:(xi)yi путём минимизации функции потерь L. (xi) признаковое описание i-й точки.
image
Функцией потерь может быть как исходная функция ошибки из постановки задачи, так и более простая функция, например, среднеквадратическое отклонение построенного и исходного путей:1Ni=1N(yi yi)^2.
Для построения отображения f можно воспользоваться множеством популярных методов машинного обучения: начиная с полиномиальной регрессии, проходя через случайный лес и глубокими нейронными сетями.
image
2) Семантическая сегментация
image
Пример семантической сегментации

Исходную задачу можно решать как задачу компьютерного зрения. Точки (x, y) рассматривать как пикселы изображения, где всё изображение это весь датасет, а яркость пиксела (x, y) значение z(x, y). Для построения пути нужно каждому пикселю присвоить один из классов 0 или 1. Часть изображения, находящаяся ниже пути или включающая его, относится к классу 0, а оставшаяся к классу 1. Бытовое решение для такой задачи полносвёрточная нейросеть U-Net, на вход получающая кусок (патч) исходного изображения и выдающая массив того же размера, состоящий из нулей и единиц, обозначающих классы соответствующих пикселов.
Кроме методов глубокого обучения, для сегментации изображений можно также использовать методы классического компьютерного зрения и обработки изображений, например, Flood fill. Это и сделал один из участников, тем самым предобработав изображение для дальнейшего применения алгоритмов поиска кратчайшего пути.
С точки зрения классических математических методов предложенная задача является классической задачей оптимизации, и мы наблюдали попытки её решения следующими группами методов:
1. Методы, использующие принцип локального экстремума;
Суть данного подхода заключается в поиске локальных экстремумов значений поверхности в пределах заданного окна поиска. Далее выбирается то значение координаты y среди найденных экстремумов, которое наименьшим образом отличается от y, найденного на предыдущем шаге.
2. Методы, использующие принцип глобального экстремума;
В рамках данного подхода при определении координаты yi ищется глобальный экстремум среди усреднённых значений поверхности карты в пределах заданного окна поиска.
3. Методы, основанные на минимизации заданной эвристики.
Данным подходом воспользовалось несколько команд, суть данного подхода заключается создании и минимизации предложенного командами функционала.

Итоги и кто победил


Для начала разберём решения участников.
Методы машинного обучения:
Одним из решений была авторегрессионная свёрточная нейросеть, выдающая вещественное число значение пути yi для i-го шага. На вход нейросети подавались патчи 32x32 пиксела исходного изображения. В качестве функции для извлечения признаков использовалась предобученная свёрточная нейросеть ResNet34. Полученное этой нейросетью признаковое представление объединялось со значениями данного пути с предыдущих 32 шагов. Для прогнозирования дальше 32 шагов в качестве предыдущих значений горизонта использовались предыдущие прогнозы нейросети. Нейросеть обучалась модификацией стохастического градиентного спуска Adam с экспоненциальным уменьшением шага оптимизатора по мере обучения. Для обучения минимизировалось среднее абсолютное отклонение (эксперименты со среднеквадратическим отклонением дали хуже результат). Во избежание переобучения использовался Дропаут, то есть случайное обнуление части нейронов. Для обучения нейросети потребовалось около 10 минут, 20 полных проходов по всему датасету и 720 шагов оптимизатора.
image
Решение, полученное с помощью свёрточной нейросети. Красная линия реальный путь, синяя полученный участником.

Прогноз нейросети занимает около 1 минуты на CPU AMD Threadripper 2950x и GPU Nvidia GTX 1080 Ti.
Результат нейросети (метрика) 5.71 на публичной турнирной таблице. Также были проделаны эксперименты с заменой свёрточной нейросети на рекуррентную, но её результат был хуже. В итоге в качестве финального решения были использованы классические методы вычислительной математики.
Кроме законченных решений, участники также поделились своими идеями, которые не успели реализовать из-за жёстких временных рамок соревнования и вычислительной сложности их задумок. Некоторые из них пытались применить нейронные сети, но, потратив большую часть времени, переходили к более простым и эффективным алгоритмам или даже к грубому перебору и правилам, что в итоге дало лучший результат и привело к призовым местам.
Также ряд интересных решений основан на знаниях из других дисциплин: например, классическое компьютерное зрение и обработка изображений, теория графов, анализ временных рядов. Одна из команд даже поставила задачу в терминах обучения с подкреплением, про которое вы могли слышать, и придумала решение, но, к сожалению, не успела его реализовать.
Классические математические методы:
image
Одно из решений, полученное методом локального экстремума. Красная линия реальный путь, синяя полученная участником.

Для данного метода в качестве экстремума использовался локальный максимум. Синим цветом отмечен построенный участниками путь, красным искомый горизонт. Подробное описание представлено ниже.
yi+1=minj-yi,i0,N-1,j,
=m|z(i,m)>z(i,m-1)z(i,m)>z(i,m+1),mm1,m2,
m1=max(1,yi-sizey),
m2=min(height-1,yi+sizey),
где:
height максимально возможное значение координаты y карты поверхности;
sizey размер окна поиска.
Метод реализован на языке Python. Время работы составило порядка 0.103 секунд, F(y, z) = 1.57, sizey= 100.
Вывод: метод достаточно прост для реализации, время работы не превышает 0.1 секунды.
image
Одно из решений, полученное глобальным экстремумом. Красная линия реальный путь, синяя полученный участником.

Перейдём к следующей группе. Как и ранее, в данном методе максимум использовался в качестве экстремума.
yi=argmax1sizex j=0sizex-1z(i+j,m),i0,N,mm1,m2,
m1=max(1,yi-sizey),
m2=min(height-1,yi+sizey),
где:
height максимально возможное значение координаты y карты поверхности;
sizex,sizey размер окна поиска.
Метод реализован на языке Python. Время работы составило порядка 0.19 секунд, F(y, z) = 1.97, sizex= 9, sizey= 21.
Вывод: метод достаточно прост для реализации, время работы не превышает 0.2 секунд.
image
Одно из решений, полученное эвристикой. Красная линия реальный путь, синяя полученный участником.

Рассмотрим последнюю группу методов. Как уже говорилось ранее, очередная координата yi+1 ищется по минимуму функционала в пределах заданного окна поиска.
Ниже представлен один из функционалов, предложенных командами. С математической точки он выглядит следующим образом:
yi+1=min(z(i,j)-z(i,yi))2max2(z)+(j-yi)2height2,i0,N-1,j,
=m|z(i,m)>z(i,m-1)z(i,m)>z(i,m+1),mm1,m2,
m1=max(1,yi-sizey),
m2=min(height-1,yi+sizey),
где:
height максимально возможное значение координаты y карты поверхности;
коэффициент, отвечающий за влияние ошибки по y на значение функционала;
sizey размер окна поиска;
max(z) наибольшее значение карты поверхности.
Метод был реализован на языке Python. Время работы составило порядка 0.12 секунд, F(y, z) = 1.58, sizey= 50, = 15000.7.
Вывод: время работы метода не превышает 0.15 секунд.
Методы всех трех групп показали достаточно близкие результаты на заданном наборе данных. Наименьшее значение метрики (1.57) было достигнуто методом, основанным на поиске локальных экстремумов значений поверхности в пределах заданного окна поиска.

Заключительная часть


К сожалению, к концу хакатона почти все новаторы перешли на темную сторону переквалифицировались и стали консервативно настроенными, то есть стали отправлять решения на классических алгоритмах и победили консерваторы.
Мы хотели объединить участников из двух областей: вычислительной математики и машинного обучения. Одни привыкли работать с неструктурированными данными неизвестной природы, другие изучать физические процессы и строить на их основе математические модели. Чтобы увеличить разнообразие идей и решений, мы кратко рассказали, как были получены данные. Это одна из причин, по которой решение на основе простых численных методов дало лучшие результаты. Второй причиной стало то, что для студенческого хакатона мы подготовили не очень сложные данные небольшого объёма, поэтому современные трудоёмкие методы машинного обучения проигрывают более простым альтернативам.
Мы считаем, что это отличный урок, который поможет участникам правильно ставить задачи и выбирать оптимальные методы для их решения. Важно помнить, что сначала стоит попробовать простое решение, так называемый бейзлайн, возможно именно он позволит достичь цели в короткие сроки.
Участниками Хакатона были предложены авторские алгоритмы нахождения оптимального пути в массиве больших данных применительно к задаче автоматической сейсмической кинематической интерпретации, которая в настоящее время решается в рамках разработки корпоративного программного обеспечения в области геологии и сейсмики. Наиболее конкурентные реализации алгоритмов найдут своё применение при разработке и реализации программных модулей данных программных комплексов.
Будем рады вас видеть на финале марафона ИТ-соревнований, который пройдёт 28 ноября онлайн. В программе: награждение победителей соревнований, презентация первой версии мобильного приложения для экспресс-оценки качества пропанта. Также в рамках мероприятия будут организованы панельные дискуссии на актуальные темы Управление данными и DS проектами и Компьютерное зрение. Интересными кейсами поделятся представители Head of Data Science Alfa, CDO Мегафон, Huawei, Head of CV X5 и др. Не пропустите всё самое интересное (Марафон ИТ-соревнований 2020 Роснефть).
Подробнее..

Томограф для нефтегазовых месторождений, или Пересечение трёхмерной расчётной сетки и плоскости на CUDA

28.12.2020 08:09:56 | Автор: admin
В данной статье приведены описание и алгоритм решения задачи построения рисунка внутренностей месторождения, являющегося результатом пересечения расчётной сетки с плоскостью. А также приведены тайминги построения решения, которые получаются на типичном компьютере геолога-модельера или гидродинамика.
image
Визуализация расчётной сетки и куба


Моделирование месторождений уже упоминалось ранее в предыдущих наших обзорах (http://personeltest.ru/aways/habr.com/ru/company/bashnipineft/blog/512052/). При построении 3D-моделей нефтегазовых месторождений в различных областях в гидродинамике, в геологии, в механике часто используются объёмные расчётные сетки. Также сетки нужны, например, при использовании метода конечных объёмов.

Одним из типовых видов расчётных сеток при моделировании коллектора (т. е. среды, где находится нефть) являются сетки, в которых каждая ячейка представлена шестигранником с четырехугольными гранями (ячейка похожа на помятый кубик). Непосредственно расчётная сетка описывает геометрию моделируемого месторождения, количество ячеек сетки обычно от нескольких миллионов до порядка миллиарда. Для моделирования физических свойств месторождения (например, пористости или проницаемости) расчётные сетки заполняются многочисленными массивами данных, называемыми кубами. Кубы описывают характеристики пород или фильтрационно-емкостные свойства месторождения.

Часто пользователю, который работает с моделью, нужно визуально оценить распределение физических свойств внутри модели месторождения. Это можно делать разными способами, например, созданием сечений или наложением масок-фильтров на ячейки сетки.
Реализовать в программе визуализацию слоев (i, j, k) сетки довольно просто и быстро.

image
Визуализация слоев сетки i, j (слайсов)

Однако хотелось бы получать рисунок вдоль произвольной плоскости, при этом иметь возможность двигать и крутить эту плоскость в произвольном направлении с хорошим FPS. Таким образом, модельеру нужен этакий быстрый томограф модели месторождения.
Геометрия угловой точки (corner-point grid) способ задания геометрии расчётных сеток из шестигранников, наиболее часто использующийся в гидродинамическом и геологическом моделировании. Такой формат подразумевает:

Наличие пилларов отрезков, каждый из которых задан двумя точками, а каждая точка тремя координатами (x, y, z). Пиллары могут быть вертикальными, наклонными, но никак не горизонтальными. Пиллары образуют множество размером M x N, но не обязательно с постоянным шагом. Множество пилларов задаётся массивом COORD.

На пиллары накидываются отметки вершин, у которых известна лишь координата z (глубина). Для каждой ячейки нужно по восемь отметок по две на четыре соседних пиллара. Эти отметки точек по сути своей являются углами ячеек, поэтому формат и называется геометрия угловой точки. Множество отметок задается массивом ZCORN. Ячейки не могут пересекаться друг с другом. Соседние ячейки не обязательно стыкуются друг с другом, поэтому даже при полном совпадении вершин граней соседних ячеек эти вершины дублируются.

Кроме этого, задаётся массив нулей и единиц ACTNUM. Нулевое значение в ячейке указывает на то, что она неактивна и её не стоит учитывать в расчётах.

image
Геометрия угловой точки

Входными данными для задачи построения сечения являются:
1) геометрия угловой точки:

  1. размерность сетки;
  2. массив COORD;
  3. массив ZCORN;
  4. массив ACTNUM;

2) коэффициенты общего уравнения секущей плоскости:
$Ax+By+Cz+D=0$

Решение не обязательно должно быть точным, ведь решение будет оцениваться пользователем только визуально. На выходе должны получиться массивы:
  • Упорядоченный массив троек индексов (i, j, k) пересечённых ячеек;
  • Упорядоченный массив координат точек полигонов пересечения ячеек;
  • Упорядоченный массив индексов точек начала нового полигона в массиве координат точек пересечения. В конце массива для удобства должно быть добавлено общее количество точек пересечения.

Такой формат выбран потому, что он удобен и для визуализации через векторные графические движки, и для визуализации через триангуляционные движки.

Хорошо бы, чтобы алгоритм построения пересечения был нетребователен к памяти, так как сами сетки довольно объёмны. Например, большая сетка на 1000х1000х1000 ячеек, построенная на типе данных одинарной точности (float) занимает примерно 30 гигабайт памяти.

Нами был разработан довольно экономный к памяти алгоритм построения пересечения геометрии угловой точки и плоскости:
1. Проход по всем ячейкам и определение факта пересечение плоскости с ячейкой:
a. Подстановка каждой вершины в левую часть уравнения плоскости.
b. Если среди полученных чисел есть хотя бы два с противоположными знаками, то пересечение есть.
c. Если среди полученных чисел есть хотя бы три нуля, то пересечение есть.
d. Запись в массив флагов факта пересечения.

image
Геометрия угловой точки, секущая плоскость, пересечённые ячейки

2. Stream Compaction: из массива флагов собираем индексы ячеек, которые пересекаются с плоскостью. Располагаем их в новом массиве компактно.

3. Для каждой пересекаемой ячейки определяем количество точек пересечения проход по всем вершинам и всем рёбрам ячейки. Складываем значения количества точек пересечения соответственно индексам ячеек в общий массив количества точек пересечения.

4. Prefix sum: префиксная сумма по массиву количества точек пересечения в ячейках. Это позволит определить смещение от начала массива координат точек для каждой ячейки.

5. Поиск и запись точек пересечения в массив координат точек пересечения.

6. Для каждой пересечённой ячейки находим барицентр точек пересечения. Составляем вектора по каждой точке пересечения и барицентру. Сортируем точки пересечения по углу относительно первого вектора, тем самым упорядочиваем точки в полигон.

image
Упорядочивание точек пересечения для одной ячейки в полигон

Таким образом получаем результирующие массивы координат полигонов и индексов начальных точек полигонов.

image
Результат пересечения геометрии угловой точки и плоскости

Видно, что каждый шаг алгоритма можно распараллелить.
Была создана реализация алгоритма, распараллеленная на потоки с помощью OpenMP. В такой реализации примерно 87% времени выполнения занимает первый пункт алгоритма проход по всем ячейкам и определение факта пересечения. Время выполнения реализации на OpenMP оказалось слишком большим для комфортной работы с пересечениями в окнах визуализации.
Чтобы ускорить построение пересечения, алгоритм был реализован на CUDA. Сетка должна быть постоянно в видеопамяти, т. к. пересылка её с оперативной памяти занимает слишком много времени, даже если использовать CUDA Streams. В такой реализации примерно 43% времени выполнения занимает первый пункт алгоритма, 20% времени пересылка результатов с видеопамяти в оперативную память. Kernel-функция, используемая в реализации для определения факта пересечения, довольно проста:

Заголовок спойлера
__global__ void checkIntersectCell (const TCOORD* coord,const TZCORN* zcorn,const TACTNUM* actnum,TFLAGS* flags,TIJK I, TIJK J, TIJK K,TPLANE A, TPLANE B, TPLANE C, TPLANE D,const TCOEF* coefX, // предрасчитанные коэффициенты для поиска координат x узловconst TCOEF* coefY // предрасчитанные коэффициенты для поиска координат y узлов){const auto globalIndex = blockDim.x * blockIdx.x + threadIdx.x;if (globalIndex < (I * J * K)){if (actnum[globalIndex]){// globalIndex = K * J * i + K * j + k = K * (J * i + j) + kconst auto k = globalIndex % K;const auto j = (globalIndex / K) % J;const auto i = (globalIndex / K) / J;int_fast8_t signPlus = 0;int_fast8_t signMinus = 0;int_fast8_t signZero = 0;for (size_t p = 0; p < vertexCount; ++p){const auto indexPillar = (J + 1) * (i + p / 4) + (j + (p / 2) % 2);const auto zPillarTop = coord[6 * indexPillar + 2];const auto z = zcorn[(2 * i + p / 4) * 2 * 2 * J * K + (2 * j + (p / 2) % 2) * 2 * K + (2 * k + p % 2)];const auto x = (z - zPillarTop) * coefX[indexPillar] + coord[6 * indexPillar + 0];const auto y = (z - zPillarTop) * coefY[indexPillar] + coord[6 * indexPillar + 1];switch (sign<int_fast8_t>(A * x + B * y + C * z + D)){case -1: ++signMinus; break;case 1: ++signPlus; break;case 0: ++signZero; break;}}flags[globalIndex] = static_cast<TFLAGS>((signMinus > 0 && signPlus > 0) || signZero >= 3);}else{flags[globalIndex] = static_cast<TFLAGS>(0);}}}


Для тестирования был взят случай, который даёт большое количество полигонов пересечения. Сетка в тестах состояла из прямоугольных параллелепипедов, по каждому направлению (x, y и z) сетка располагалась от 0 м до 100 м. Плоскость проходила через центр сетки и имела нормаль (1, 1, 1).

image
Геометрия угловой точки и секущая плоскость для тестирования

Результаты тестирования и замеры времени выполнения представлены ниже. Тестирование проводилось на одном и том же компьютере.

image
Таблица с результатами тестирования и замерами времени выполнения

image
Синяя диаграмма показывает ускорение построения пересечения на OpenMP на 8 потоках относительно OpenMP на 1 потоке. Зелёная диаграмма показывает ускорение построения пересечения на CUDA относительно OpenMP на 8 потоках

Из результатов замеров времени выполнения видно, что, используя реализацию на CUDA, можно добиться практически незамедлительного построения пересечения больших сеток. А учитывая то, что CUDA и OpenGL функционально совместимы, то результат построения можно не пересылать с видеопамяти в оперативную память, что ускорит время решения задачи примерно на 20%.

Также видно, что количество вершин в результате пересечения незначительно отличается. Это происходит в случае, когда плоскость касается угла ячейки. Из-за точности расчётов в результате может засчитаться в пересечение очень маленький треугольник, а может и быть пропущен. Результат различается не только между построением на CPU и GPU, но также и между построением на различных CPU и на различных GPU.
Пересечение геометрии угловой точки и плоскости обычно просматривают в 3D окне.

image
Модель месторождения и секущая плоскость

image
Результат пересечения модели месторождения и плоскости

Заключение: в статье показан пример решения одной из многих задач, возникающих при создании программного обеспечения для процессов моделирования месторождений нефти и газа. Несмотря на огромный парк open-source кодов, решение подобных задач требует мультидисциплинарной подготовки разработчиков, и поэтому представляется интересными развивающими вызовами в области computer science, в которых доля рутинного программирования минимальна, а мозги надо включать на полную. Этим и интересны задачи нашей предметной области, к которым хотелось бы привлечь внимание аудитории и потенциально заинтересованных энтузиастов и разработчиков. В частности, создание построителя пересечения геометрии угловой точки и плоскости являлось задачей на одном из хакатонов, проведённых в 2019 году РН-БашНИПИнефть при участии Уфимского Государственного Авиационного Технического Университета (УГАТУ).

Стоит отметить, что результатом 12-часовой работы команд оказались не полностью доработанные и не до конца оптимизированные решения: основной трудностью стало упорядочивание точек пересечения ячейки в полигон, также команды добавляли каждый новый полигон в конец контейнера координат точек, что не поддавалось распараллеливанию.

P. S. Возможно, поиск пересекаемых ячеек был бы быстрее, если бы применялось K-d дерево. Но реализовать такое решение гораздо сложнее, учитывая, что нужно придумать, как удачно построить само дерево поиска и равномерно распараллелить поиск на потоки. К тому же, если даже теоретически поиск ускорить так, чтобы он вообще не занимал времени (сейчас занимает 87% времени), то производительность на OpenMP реализации вырастет в 7.7 раз, что всё равно медленнее, чем реализация на CUDA.
Подробнее..

Наблюдения за погодными условиями в проекте с CCLI

01.02.2021 12:14:39 | Автор: admin

Каждая команда в своей работе сталкивается с необходимостью внедрения новой технологии или языка программирования в проект. Иногда это внедрение проходит успешно, а иногда нет. В этой статье хотелось бы рассказать о нашем опыте использования C++/CLI.

Начало. Ожидается солнечная погода

Задание: разработать программный комплекс для моделирования различных процессов, протекающих на объектах в системах сбора, подготовки и транспортировки углеводородов. Объектами моделирования могут быть скважины (как добывающие, так и нагнетательные), трубопроводы, объекты подготовки нефти, газа и воды. В среднем каждое месторождение характеризуется более чем 100 объектами обустройства. Причём некоторые объекты имеют размерность либо по глубине, либо по длине в несколько километров. Приемлемое время расчёта модели одного месторождения порядка нескольких минут. Если совсем просто, то необходимо представить вот такой объект:

В виде вот такой модели и рассчитать её характеристики.

Наработки: существующие методики, существующий проект с функциональностью, частично покрывающей задачи проекта.

Команда: программист стека .NET/WPF, программист C++, методист, руководитель проекта.

На первом этапе задача состояла в том, чтобы освоиться с уже существующей кодовой базой, понять, что и как работает, убрать всё лишнее, добавить часть нового функционала в соответствии с описанием, полученным от методистов. Небольшое замечание, которое в дальнейшем будет иметь значение: все расчёты должны быть выполнены на C++, это было связано с тем, что необходимо обеспечить:

высокую скорость расчётов;

последующее использование наработок в качестве подмодулей для других приложений.

Безоблачное продолжение

Уже существующий проект, на базе которого предстояло начать работать, был выполнен с использованием .NET/WPF, методики расчёта модели реализованы при помощи .NET/C# c промежуточными вызовами плюсового кода через P/Invoke. P/Invoke (для справки) это технология, которая позволяет обращаться к структурам, обратным вызовам и функциям в неуправляемых библиотеках из управляемого кода. Т. е. примерно вот так:

Код на C# содержал описание моделей объектов, участвующих в расчёте, а также расчёт сети объектов. За расчёт параметров отдельного объекта отвечала плюсовая часть. Время выполнения расчёта соответствовало заявленным требованиям, поэтому было решено оставить расчёт сети объектов на C# и сосредоточиться на расширении расчётов параметров самих объектов на C++.

Так как предстояло значительное увеличение количества вычисляемых параметров (и, соответственно, количества параметров, которые необходимо передавать через P/Invoke), то возник вопрос: "Использовать прежнюю схему взаимодействия с неуправляемым кодом или воспользоваться другими технологиями?".

Ключевыми критериями для выбора мы определили скорость взаимодействия и удобство использования.

В качестве альтернативы использованию P/Invoke, возникла идея использования технологии C++/CLI.

Спецификация языка C++/CLI (C++ modified for Common Language Infrastructure) была создана компанией Microsoft на замену Managed Extensions for C++. C++/CLI позволяет одновременно работать как с классами и методами языков .NET, так и с обычным кодом C++.

Приставка CLI расшифровывается как Common Language Infrastructure это открытая спецификация (технический стандарт), разработанная Microsoft и стандартизированная ISO и Ecma, описывающая исполняемый код и среду выполнения, которая позволяет использовать несколько языков высокого уровня на различные компьютерных платформах без переписывания под конкретные архитектуры. Т. е. C++/CLI нужен вот для этого:

В C++/CLI, прежде всего, нам показалось привлекательной возможность вызова уже написанного на плюсах кода при помощи управляемых оберток для существующих классов на С++. Сравнительный тест скорости вызова плюсового кода при помощи C++/CLI и P/Invoke, как ни странно, также показал уменьшение времени расчёта при использовании первого.

Вызовов P/Invoke на тот момент было совсем немного и поэтому в короткий срок нам удалось перейти на использование новой технологии. Стандартный вариант использования C++/CLI в нашем проекте выглядел примерно вот так:

public ref class DeviceBaseClr : public IDisposable, public Figures::Models::IItemBase

{

#pragma region Поля и свойства

protected:

/// <summary>

/// C++ unmanaged объект декоратора

/// </summary>

DeviceBase* obj_;

#pragma endregion

#pragma region IItemBase

public:

virtual IState^ GetState(DateTime date);

virtual IState^ SetState(DateTime date, IState^ state);

#pragma endregion

#pragma region Конструкторы

public:

DeviceBaseClr(IStateFactory^ stateFactory);

virtual ~DeviceBaseClr();

protected:

!DeviceBaseClr();

#pragma endregion

};

} // Simtep::Diagrams

#endif // _DEVICEBASECLR_H_

Предполагаемая архитектура приложения, выполненного в соответствии с парадигмой MVVM, выглядела следующим образом:

Тучи сгущаются

На следующем этапе развития проекта, по мере наращивания функционала, мы начали сталкиваться с некоторыми проблемами.

Во-первых, появилась необходимость вызова расчётов реализованных на C# внутри неуправляемого кода (и, кстати, да C++/CLI и это позволяет делать тоже).

Во-вторых, нам пришлось опустить часть модели в неуправляемую часть из-за того, что возникла необходимость использования сторонних библиотек, реализованных на С++.

После этих изменений архитектура приложения приобрела следующий вид:

В результате возникли как технические проблемы:

Мы не могли просто подключать сторонние библиотеки на C++ (имеются в виду библиотеки с расчётами предоставленные нашими коллегами из параллельных проектов), нужно было пересобирать их из исходного кода, используя специальные директивы для CLI.

Существует отдельный синтаксис LINQ для CLI, его возможности ограничены по сравнению с обычным, например, в нём нет лямбда-выражений, писать отдельные методы каждый раз не очень удобно.

Отсутствие возможности использовать умные указатели.

Постоянно возникали вопросы при использовании контейнеров, например при попытке добавления в коллекцию, созданную на стороне неуправляемого кода, объекта, созданного на стороне .NET.

Управление памятью, например, что будет, если для одного нативного объекта вдруг создастся две обёртки на CLI, и в какой-то момент будет освобождена сборщиком мусора?

При организации взаимодействия нужно быть готовым к тому, что для каждого объекта придётся писать обёртку. И их может потребоваться очень много.

Логика классов может усложняться, что неизбежно ведёт к усложнению обёрток.

Как уже было сказано выше, рано или поздно возникает необходимость обратного использования управляемого кода в неуправляемом. C++/CLI позволяет это сделать, при этом увеличивается сложность проекта.

Так и вопросы организационного характера:

C++/CLI это всё-таки ещё один язык программирования. Т. е. если к вам в команду добавляется джуниор с базовыми знаниями по C++, нужно учитывать, что ему необходимо влиться в предметную область, чуть подтянуть свой уровень владения C++ и плюс ко всему выучить ещё один язык программирования. Ну и, соответственно, ошибки можно сделать как в нативном коде, так и в обёртке.

Программистам C# будет тяжело в случае необходимости внести изменения в обёртку.

По мере развития проекта мы стали замечать, что большая часть времени уходит не на расширение функционала, а именно на изучение самого C++/CLI, особенностей его синтаксиса и поддержание кода именно обёрток. Разумеется, к обычным ошибкам, сопутствующим процессу разработки, добавились ошибки, возникающие на стыке C# и C++/CLI.

Возможно, мы бы продолжали поддерживать и развивать проект в таком виде, если бы не ещё одна проблема, которая стала критической, а именно мы перестали укладываться в ограничения по времени выполнения расчёта модели. Это случилось не в один день, просто каждая итерация по расширению функционала вносила свой вклад в общее время расчёта. Если при старте проекта мы рассчитывали лишь простые параметры по объекту, то расчётное ядро значительно увеличилось в размерах:

Попытки оптимизации кода не давали нужных результатов, помимо возросшего функционала. Причины низкой скорости расчётов крылись в следующем:

Множественный вызов CLI. Почти на каждой строке. Это значит постоянное создание декораторов, постоянный (почти непрерывный маппинг) как в одну сторону, так и в другую.

Использование декораторов означает их создание, т. е. постоянное выделение памяти внутри расчётного цикла.

Цикл расчёта на стороне .NET, не позволявший осуществить многопоточный расчёт в полной мере.

Плюс системные затраты на преобразование типов из managed в unmanaged и обратно (речь о передаче стандартных типов).

Разгон облаков

Скорость расчёта критична для нашего приложения, поэтому нам было необходимо либо дальше оптимизировать существующий код с небольшими шансами на успех, либо попытаться отделить расчёты от интерфейса и модели (заодно отказавшись от CLI) с чуть более высокими шансами. В итоге мы выбрали второе. По сути, это означало практически переписать приложение на 70 процентов заново.

Какие факторы помогали нам верить в успешность задуманного:

сработавшаяся команда разработчиков;

высокая степень владения кодом;

высокая степень понимания разработчиками предметной области;

запас времени перед сдачей этапа;

природный оптимизм.

Новая архитектура в наших планах выглядела следующим образом:

Подобное разделение позволило бы нам избавиться от проблем с CLI и воспользоваться, наконец, в полной мере скоростью расчётов на чистом C++. Из минусов( если это можно назвать минусом) появилась необходимость создания и поддержания эквивалентной модели на стороне С++, а также обеспечения взаимодействия между моделями.

При реализации взаимодействия был соблазн воспользоваться RabbitMQ или ZeroMQ, однако, оценивая вероятность того, что мы одновременно сумеем и переписать большую часть кода, и реализовать механизм взаимодействия на основе очереди сообщений, мы решили выбрать самый простой вариант, а именно файловый обмен. На практике при грамотной реализации с ним возникло меньше всего проблем, в том числе и по скорости.

Переход на новую архитектуру занял у нас около 3-х месяцев, и если говорить о каких-то подводных камнях, то они были такими:

Мы планировали завершить рефакторинг во время Х, а закончили во время 3*Х. Значительное превышение первоначальных сроков было связано с тем, что изначально в проекте были большие фрагменты кода, написанные на C#. Во время оценки времени, необходимого на переход, мы не учли того, что у нас отсутствует формализованное описание алгоритмов для этих фрагментов, а прямой перенос не всегда был возможен.

Рефакторить 3 месяца при отсутствии навыков программирования на C++ большей части команды было тяжело.

Ожидается солнечная погода без осадков

Подводя итог, хочется сказать, что:

C++/CLI это интересный язык программирования, и в некоторых случаях он позволяет значительно упростить жизнь. Однако прежде, чем внедрять его в свой проект, мы бы посоветовали заранее на этапе проектирования очертить рамки, в которых он будет использоваться. Т. е. в случае, когда он используется для обеспечения взаимодействия с нативным кодом, по нашему мнению, это должно быть либо штучное взаимодействие крупных узлов системы, либо подключение небольшого класса или функции. В противном случае вы рискуете повторить наши ошибки. Всем спасибо!

Если у кого-то есть свой опыт использования C++/CLI, то нам было бы интересно о нём узнать.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru